这是我的字符串:
<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()
标记。如何在正则表达式中执行“不包含”操作?
答案 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。