регулярное выражение, чтобы удалить весь абзац на основе его содержимого? - PullRequest
1 голос
/ 19 февраля 2011

Эй, ребята, я регулярный пользователь noob, возможно ли с помощью preg_replace удалить тег целого абзаца?

<p><div class="vidwrapper"> lot of content with oder divs etc. </div><p>

Абзац следует удалять только в том случае, если после div есть класс.vidwrapper.

Это вообще возможно?Любая идея, как это регулярное выражение будет выглядеть?Спасибо за вашу помощь.

Ответы [ 3 ]

1 голос
/ 19 февраля 2011

Если это фиксированное вхождение, может сработать следующее:

preg_replace('#<p>[^<]*<div[^>]+class="vidwrapper"[^>]*>.*?</p>#is', "")

Для сопоставления вложенного html обычно требуется рекурсивное регулярное выражение, поэтому в таком случае что-то вроде phpQuery или QueryPath часто проще:

$html = pq($html)->find("p div.vidwrapper")->parent()->remove()->html();
1 голос
/ 19 февраля 2011

Это плохая идея делать это с помощью регулярных выражений, если только вы не знаете, что внутри vidwrapper не будет абзаца (или чего-либо, что может быть поверхностно интерпретировано как абзац).

Если вы этого не сделаете, написать регулярное выражение для чего-то подобного будет очень сложно:

<p><div class="vidwrapper"> Hello there. <p>Wee.</p> Yoink. </div></p>
<p><div class="vidwrapper"> Hello there. <!-- <p>Wee.</p> --> Yoink. </div></p>

Более простой (и более надежный) способ, вероятно, состоит в том, чтобы проанализировать HTML с помощью анализатора HTML и вместо этого выполнить поиск по дереву DOM.

Смотри также:

0 голосов
/ 19 февраля 2011

Если вы думаете, что скрипт вызовет проблемы, вы можете использовать это также.

#
 \s*
 <p\s*> \s* <div \s+ class \s* = \s* (["']) vidwrapper \1 \s* >
 (?:
      <script (?:\s+ (?:".*?"|'.*?'|[^>]*?)+)? \s*>
      .*?
      </script\s*>)
   |  .
 )*?
 </p\s*>
#xs
...