如何在正则表达式中执行“不包含”操作?

时间:2009-11-25 11:20:24

标签: php regex

这是我的字符串:

<br/><span style=\'background:yellow\'>Some data</span>,<span style=\'background:yellow\'>More data</span><br/>(more data)<br/>';

我想产生这个输出:

  

一些数据,更多数据

现在,我在PHP中执行此操作以过滤掉数据:

$rePlaats = "#<br/>([^<]*)<br/>[^<]*<br/>';#";
$aPlaats = array();
preg_match($rePlaats, $lnURL, $aPlaats);    // $lnURL is the source string
$evnPlaats = $aPlaats[1];

如果不是这些<span>标记,则可以使用,如下所示:

<br/>Some data,More data<br/>(more data)<br/>';

我必须重写正则表达式以容忍HTML标记(<br/>除外)并使用<span>函数删除strip_tags()标记。如何在正则表达式中执行“不包含”操作?

4 个答案:

答案 0 :(得分:2)

不要听这些DOM纯粹主义者。使用DOM解析HTML,您将拥有一个难以理解的树。如果你知道你在追求什么,那么用正则表达式解析HTML是完全可以的。

步骤1)将<br */?>替换为{break}

步骤2)用空字符串替换<[^>]*>

步骤3)将{break}替换为<br>

答案 1 :(得分:1)

不要因为太多的正则表达而烦恼自己。使用普通的PHP字符串函数

$str = "<br/><span style=\'background:yellow\'>Some data</span>,<span style=\'background:yellow\'>More data</span><br/>(more data)<br/>';";
$s = explode("</span>",$str);
for($i=0;$i<count($s)-1;$i++){
    print preg_replace("/.*>/","",$s[$i]) ."\n"; #minimal regex
}

"</span>"上爆炸,因为您要获取的数据都在"</span>"附近。然后遍历数组的每个元素,从start开始替换为“&gt;”。这将获得您的数据。最后一个元素被排除在外。

输出

$ php test.php
Some data
More data

答案 2 :(得分:0)

如果你真的想为此使用正则表达式,那么你最好使用正则表达式替换。这个正则表达式应该与标签匹配,我只是将它从头顶掀起,所以它可能不完美:

&LT; [A-ZA-Z0-9] {0,20}(\ S + [A-ZA-Z0-9] {0,20} =(( “[^”] “) |( '[^'] '?))){0,20} \ S * [/] {0,1}&GT;

一旦所有标签都消失了,其余的字符串操作应该非常简单

答案 3 :(得分:-1)

如前所述,多次不使用正则表达式来解析html。改为使用DOM。