используя preg_match с HTML-комментариями - PullRequest
0 голосов
/ 23 ноября 2018

Я хочу преобразовать в строку HTML, содержащийся между этими комментариями

<!--content-start-->
 desired html
<!--content-end-->

, поэтому я использую pregmatch, верно?

preg_match("/<!--content-start-->(.*)<!--content-end-->/i", $rss, $content);

, но это не сработает.Может быть проблема с REGEX?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Нечто подобное должно работать.Запрос XPath ищет комментарий, содержащий «content-start», а затем возвращает дочерние узлы, следующие за ним.Мы перебираем, пока не найдем заключительный комментарий.

$html = <<< HTML
<!--content-start-->
<p>Here is my <i>desired html</i></p>
<!-- a comment -->
<div class="foo">Here is more</div>
<!--content-end-->
<p>Not returning this</p>
HTML;
$return = "";
$dom = new DomDocument;
$dom->loadHTML($html, LIBXML_HTML_NODEFDTD | LIBXML_HTML_NOIMPLIED);
$xpath = new DomXpath($dom);
$siblings = $xpath->query("//comment()[.='content-start']/following-sibling::node()");
foreach ($siblings as $node) {
    if ($node instanceof DOMComment && $node->textContent === "content-end") {
        break;
    }
    $return .= $dom->saveHTML($node) . "\n";
}
echo $return;

Вывод:

<p>Here is my <i>desired html</i></p>
<!-- a comment -->
<div class="foo">Here is more</div>
0 голосов
/ 23 ноября 2018

Возможно, модификатор /s поможет.Проверьте документацию :

s (PCRE_DOTALL)

Если этот модификатор установлен, метасимвол точки в шаблоне соответствует всем символам, включая символы новой строки.Без этого новые строки исключаются.Этот модификатор эквивалентен модификатору Perl's / s.Отрицательный класс, такой как [^ a], всегда соответствует символу новой строки, независимо от установки этого модификатора.

...