Получать контент в теге html с помощью php и заменять его после обработки

У меня есть html (sample.html), как это:

<html> <head> </head> <body> <div id="content"> <!--content--> <p>some content</p> <!--content--> </div> </body> </html> 

Как получить часть контента, которая находится между 2 комментариями html '<!--content-->' используя php? Я хочу получить это, сделать некоторые обработки и разместить его обратно, так что я должен получить и положить! Является ли это возможным?

Solutions Collecting From Web of "Получать контент в теге html с помощью php и заменять его после обработки"

esafwan – вы можете использовать выражение регулярного выражения для извлечения содержимого между div (определенного идентификатора).

Я уже делал это для тегов изображений, поэтому применяются те же правила. я посмотрю код и немного обновляю сообщение.

[update] попробуйте следующее:

 <?php function get_tag( $attr, $value, $xml ) { $attr = preg_quote($attr); $value = preg_quote($value); $tag_regex = '/<div[^>]*'.$attr.'="'.$value.'">(.*?)<\\/div>/si'; preg_match($tag_regex, $xml, $matches); return $matches[1]; } $yourentirehtml = file_get_contents("test.html"); $extract = get_tag('id', 'content', $yourentirehtml); echo $extract; ?> 

или более просто:

 preg_match("/<div[^>]*id=\"content\">(.*?)<\\/div>/si", $text, $match); $content = $match[1]; 

Джим

Если это простая замена, которая не требует синтаксического анализа фактического HTML-документа, для этого вы можете использовать регулярное выражение или даже просто str_replace . Но в целом, не рекомендуется использовать Regex для HTML, потому что HTML не является регулярным, и придумывание надежных шаблонов может быстро стать кошмаром .

Правильный способ анализа HTML на PHP – использовать библиотеку синтаксического анализа, которая на самом деле знает, как понимать HTML-документы. Ваша лучшая собственная ставка будет DOM, но PHP имеет ряд других собственных расширений XML, которые вы можете использовать, а также существует ряд сторонних библиотек, таких как phpQuery , Zend_Dom , QueryPath и FluentDom .

Если вы используете функцию поиска, вы увидите, что эта тема широко освещается, и у вас не должно быть проблем с поиском примеров, которые показывают, как решить ваш вопрос.

 <?php $content=file_get_contents("sample.html"); $comment=explode("<!--content-->",$content); $comment=explode("<!--content-->",$comment[1]); var_dump(strip_tags($comment[0])); ?> 

проверьте это, это сработает для вас

Посмотрите здесь пример кода, который означает, что вы можете загрузить HTML-документ в SimpleXML http://blog.charlvn.com/2009/03/html-in-php-simplexml.html

Затем вы можете рассматривать его как обычный объект SimpleXML .

EDIT: Это будет работать только в том случае, если вы хотите, чтобы содержимое в теге (например, между <div> и </ div>)

Проблема с вложенными divs Я нашел решение здесь

 <?php // File: MatchAllDivMain.php // Read html file to be processed into $data variable $data = file_get_contents('test.html'); // Commented regex to extract contents from <div class="main">contents</div> // where "contents" may contain nested <div>s. // Regex uses PCRE's recursive (?1) sub expression syntax to recurs group 1 $pattern_long = '{ # recursive regex to capture contents of "main" DIV <div\s+class="main"\s*> # match the "main" class DIV opening tag ( # capture "main" DIV contents into $1 (?: # non-cap group for nesting * quantifier (?: (?!<div[^>]*>|</div>). )++ # possessively match all non-DIV tag chars | # or <div[^>]*>(?1)</div> # recursively match nested <div>xyz</div> )* # loop however deep as necessary ) # end group 1 capture </div> # match the "main" class DIV closing tag }six'; // single-line (dot matches all), ignore case and free spacing modes ON // short version of same regex $pattern_short = '{<div\s+class="main"\s*>((?:(?:(?!<div[^>]*>|</div>).)++|<div[^>]*>(? 1)</div>)*)</div>}si'; $matchcount = preg_match_all($pattern_long, $data, $matches); // $matchcount = preg_match_all($pattern_short, $data, $matches); echo("<pre>\n"); if ($matchcount > 0) { echo("$matchcount matches found.\n"); // print_r($matches); for($i = 0; $i < $matchcount; $i++) { echo("\nMatch #" . ($i + 1) . ":\n"); echo($matches[1][$i]); // print 1st capture group for match number i } } else { echo('No matches'); } echo("\n</pre>"); ?>