为什么我的正则表达式删除空格?
问题描述:
$str = "& &svnips  ∴ ≈ osidnviosd & sopinsdo";
$regex = "/&[^\w;]/";
echo preg_replace($regex, "&", $str);
我试图用编码的替换所有未编码的&符号。
问题是它删除了&
和sopinsdo
之间的空间。为什么我的正则表达式删除空格?
任何想法为什么?
答
为什么使用正则表达式?为什么不使用htmlspecialchars()
?
echo htmlspecialchars($str, ENT_NOQUOTES, 'UTF-8', false);
注意第四个参数。它告诉它不要加倍编码任何东西。所以基本上,这将关闭所有<
为<
,所有>
为>
,所有&
不属于现有实体的一部分进入&
但是,如果你必须使用正则表达式,你可以这样做:
$regex = '/&([^\w;])/';
echo preg_replace($regex, '&\1', $str);
基本上,它保存了非单词字符,然后将其添加回去...
答
您搜索2个字符(“&”,这是不是一个字符(或\ W)),并与&
更换你应该&
替换(添加一个空格替换字符串的结尾)
答
所以你不想删除&和sopinsdo之间的空间。只需添加一个
echo preg_replace($regex, "& ", $str);
+2
是的,但是'&$ foo'会失败(它会将它转换为'& foo')... – ircmaxell 2010-08-13 14:43:55
答
这个正则表达式可以做你要找的东西。
preg_replace('/&(?!\w+;)/', '&', $text);
因此,对于一些简单的测试案例,你可以得到正确转义HTML:
'& sopinsdo' -> '& sopinsdo'
'& sopinsdo' -> '& sopinsdo'
'sopinsdo & foo; bar' -> 'sopinsdo & foo; bar'
'sopinsdo &foo bar' -> 'sopinsdo &foo bar'
这有同样的问题,如下unigg的答案。有些情况会导致不良行为。 – eldarerathis 2010-08-13 15:14:06