我制作了一个正则表达式来删除空格和其他垃圾,例如新行和制表符。
preg_replace('/[\s\t\n\r]+/mu', ' ', $var);
但是我的字符串是 html 编码的,这意味着我将一些字符替换为 &#...;
我们还能做些什么来解释编码的字符呢?
我想知道是否可以对组进行这样的量词。
preg_replace('/(\s|	| )+/mu', ' ', $var)
编辑
是的,这似乎有效:
$str=' t 	 e 	 	 	 s	t	 ';
echo '|'.preg_replace('/(\s|	| )+/mu',' ',$str).'|';
^ 产生预期的结果:| t e s t |
你可以先做一个html解码,然后应用正则表达式,结束然后再次编码
像这样的东西:
$result = htmlentities(preg_replace('/[\s\t\n\r]+/mu', ' ', html_entity_decode($var)));
单个正则表达式可能还不够。
这将用它的实际 ascii 字符替换任何不是控制字符的实体编码的ascii值,用空格替换控制字符,并保留 126 以上的所有内容。
<?php
$in = "& À";
$out = preg_replace_callback('/&#(\d{1,4});/u', function($match) {
$v = $match[1]+0;
if($v < 33) return ' ';
elseif($v > 126) return $match[0];
else return chr($v);
}, $in);
$out = preg_replace('/\s{2,}/mu', ' ', $out);
echo $out;
?>
注意:从技术上讲 127 ( ESC
) 也是 ascii,但为了更简短的示例,我跳过了它。
您可以扩展回调(和正则表达式)或在中间步骤中删除命名实体。但是请注意,这
不等同于它是一个可能不会换行的空格宽度不可见字符。其他命名实体也是如此(您通常希望保留,等) 
 
­
&
先使用html_entity_decode()
然后再使用preg_replace
,例如
preg_replace('/[\s\t\n\r]+/mu', ' ', html_entity_decode($var));