регулярное выражение, чтобы соответствовать всем, кроме одного слова - PullRequest
0 голосов
/ 07 февраля 2012

Я пытаюсь захватить следующий шаблон «все, кроме data-extra»

Вот строка поиска:

<li data-extra="star" class = "result">a</li>
<li class = "result">b</li>
<li class = "result">c</li>
<li data-extra="star" class = "result">d</li>
<li class = "result">e</li>

И я хотел бы сопоставить только b, cи e (без данных)

Я сделал что-то вроде этого

<li(?!(data\-extra))class="result"(.*?)>

, но это не работает (результат 0 с php preg_match_all)

Ответы [ 4 ]

6 голосов
/ 07 февраля 2012

Используйте xpath_match_all и

$results = xpath_match_all('//li[not(@data-extra)]', $htmlString);

Если вы также хотите явно включить класс, измените XPath на

//li[not(@data-extra) and @class="result"]

Переменная $results будет содержать innerHTML и outerHTML найденных узлов.

2 голосов
/ 07 февраля 2012

Я думаю, что вы пропустили пропуски в своем регулярном выражении. Вот как .NET регулярное выражение:

\s+!(data-extra).+>(.+)&lt;/li>
1 голос
/ 07 февраля 2012

Это способ, который использует регулярные выражения, хотя синтаксический анализатор HTML, как правило, является лучшей идеей:

<?php
  $a = '<li data-extra="star" class = "result">a</li>
  <li class = "result">b</li>
  <li class = "result">c</li>
  <li data-extra="star" class = "result">d</li>
  <li class = "result">e</li>';

  preg_match_all('/<li(([^>])(?<!data\-extra))*>(.*)<\/li>/', $a, $m);
  print_r($m[0]);
?>
1 голос
/ 07 февраля 2012

Это:

<li ([^data\-extra]).+>

, кажется, работает - хотя я только проверял это здесь - http://regexpal.com/ и не обязательно против php.

Вполне возможно, что есть более чистый способ сделать это.

...