正则表达式匹配除一个单词之外的所有内容

时间:2012-02-07 11:36:08

标签: php regex html-parsing

我正在尝试捕获以下模式“除了数据额外的所有内容”

这是搜索字符串:

<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"(.*?)>

但是这不起作用(使用php preg_match_all得到0结果)

4 个答案:

答案 0 :(得分:6)

使用xpath_match_all

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

如果您还要明确包含该类,请将XPath更改为

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

$results变量将包含找到的节点的innerHTML和outerHTML。

答案 1 :(得分:2)

我认为你错过了正则表达式中的空白。这里有一个.NET regexp:

\s+!(data-extra).+>(.+)&lt;/li>

答案 2 :(得分:1)

此:

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

似乎有用 - 虽然我只在这里测试过它 - http://regexpal.com/而不一定是针对php。

虽然可能有更简洁的方法。

答案 3 :(得分:1)

这是一种使用正则表达式的方法,尽管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]);
?>