为什么我的正则表达式删除空格?

时间:2010-08-13 14:22:28

标签: php regex

$str = "& &svnips   Â ∴ ≈ osidnviosd & sopinsdo";   
$regex = "/&[^\w;]/";
echo preg_replace($regex, "&", $str);

我正在尝试用编码的替换所有未编码的&符号 问题是它删除了&sopinsdo之间的空格。

知道为什么吗?

4 个答案:

答案 0 :(得分:2)

您搜索2个字符(“&”和非字符(;或\ w))并将其替换为&

您应该替换为&(在替换字符串末尾添加空格)

答案 1 :(得分:2)

为什么要使用正则表达式?为什么不使用htmlspecialchars()

echo htmlspecialchars($str, ENT_NOQUOTES, 'UTF-8', false);

注意第四个参数。它告诉它不要对任何东西进行双重编码。基本上,这会将所有<变为&lt;,将所有>变为&gt;,将所有不属于现有实体的&变为{{1} }}

但是,如果你必须使用正则表达式,你可以这样做:

&amp;

基本上,它会保存非单词字符,然后将其添加回来......

答案 2 :(得分:1)

这个正则表达式可以满足您的需求。

preg_replace('/&(?!\w+;)/', '&amp;', $text);

因此,对于一些简单的测试用例,您可以获得正确的转义HTML:

'& sopinsdo'          -> '&amp; sopinsdo'
'&amp; sopinsdo'      -> '&amp; sopinsdo'
'sopinsdo & foo; bar' -> 'sopinsdo &amp; foo; bar'
'sopinsdo &foo bar'   -> 'sopinsdo &amp;foo bar'

答案 3 :(得分:0)

因此,您不希望删除&amp; sopinsdo 之间的空格。只需添加一个

echo preg_replace($regex, "&amp; ", $str);