2010-08-13 104 views
3
$str = "& &svnips   Â ∴ ≈ osidnviosd & sopinsdo"; 
$regex = "/&[^\w;]/"; 
echo preg_replace($regex, "&", $str); 

我试图用编码的替换所有未编码的&符号。
问题是它删除了&sopinsdo之间的空间。为什么我的正则表达式删除空格?

任何想法为什么?

回答

2

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

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

注意第四个参数。它告诉它不要加倍编码任何东西。所以基本上,这将关闭所有<&lt;,所有>&gt;,所有&不属于现有实体的一部分进入&amp;

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

$regex = '/&([^\w;])/'; 
echo preg_replace($regex, '&amp;\1', $str); 

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

2

您搜索2个字符(“&”,这是不是一个字符(或\ W)),并与&amp;

更换你应该&amp;替换(添加一个空格替换字符串的结尾)

+1

这有同样的问题,如下unigg的答案。有些情况会导致不良行为。 – eldarerathis 2010-08-13 15:14:06

0

所以你不想删除&sopinsdo之间的空间。只需添加一个

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

是的,但是'&$ foo'会失败(它会将它转换为'& foo')... – ircmaxell 2010-08-13 14:43:55

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' 
相关问题