preg_replace正则表达式不匹配

时间:2012-04-17 07:53:05

标签: php regex

我有一个像

这样的字符串
abcd : 12
<br />
cc : 25
<br />
some : 0
<br />
make : 02.36
<br />
Kk : 11.00
<br />
mm : 0

我想删除所有拥有: 0

的行

我试试

$ragid  = "|<br />s*(.*?) : 0 s*(.*?)<br />|i"; 
$text=preg_replace($ragid,"",$text);

但它会从<br />替换所有字符串开头,并以<br />

结尾

它与我想要的完美不符。 任何解决方案?

4 个答案:

答案 0 :(得分:2)

这应该这样做:

preg_replace('/(^|<br\s*\/?>)\s*(.*?)\s*:\s*0(\s+|$)/i', '', $str);

修改
并且在进行快速测试后here is the output

答案 1 :(得分:1)

如果您使用PCRE的多行模式(m - 修饰符),则每行很容易:

~^.*$~m

这会使^与行的开头匹配,$匹配行的结尾。

所以要匹配末尾包含: 0的所有行:

~^(.*: 0$\n?)~m

如果您需要更多的行结尾兼容性,则可以使用\R代替\n来使行结尾可配置。选项(*ANYCRLF)也暗示了^$的含义:

~(*ANYCRLF)^(.*: 0$\R?)~m

示例:

$str = <<<STR
abcd : 12
<br />
cc : 25
<br />
some : 0
<br />
make : 02.36
<br />
Kk : 11.00
<br />
mm : 0
STR;

echo preg_replace('~(*ANYCRLF)^(.*: 0$\R?)~m', '', $str);

输出:

abcd : 12
<br />
cc : 25
<br />
<br />
make : 02.36
<br />
Kk : 11.00
<br />

答案 2 :(得分:0)

我认为你正在寻找的表达方式是这样的:/.* : 0\n/i

答案 3 :(得分:0)

你走了:

$text = preg_replace('~<br />\s[^:]* : 0\s?~', '', $text);