我制作了一个正则表达式来删除空格和其他垃圾,例如新行和制表符。
preg_replace('/[\s\t\n\r]+/mu', ' ', $var);
但是我的字符串是html编码的,这意味着我将一些字符替换为&#...;
我们还可以做些什么来解释编码的字符?
答案 0 :(得分:1)
我想知道是否可以为这些小组制作类似这样的量词。
preg_replace('/(\s|	| )+/mu', ' ', $var)
修改强>
是的,这似乎有效:
$str=' t 	 e 	 	 	 s	t	 ';
echo '|'.preg_replace('/(\s|	| )+/mu',' ',$str).'|';
^产生预期结果:| t e s t |
答案 1 :(得分:0)
你可以先做一个html解码,然后应用正则表达式,然后再对其进行编码
类似的东西:
$result = htmlentities(preg_replace('/[\s\t\n\r]+/mu', ' ', html_entity_decode($var)));
答案 2 :(得分:0)
单个正则表达式可能还不够。
这将替换任何实体编码的 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,但我为了更短的例子而跳过它。
您可以在中间步骤中展开回调(和正则表达式)或删除命名实体。但请注意,
不等同于 
,而是 
,它是一个可能无法换行的空格宽度不可见字符。其他命名实体也是如此(您通常希望保留­
,&
等。)
答案 3 :(得分:-1)
先使用html_entity_decode()
,然后使用preg_replace
,例如
preg_replace('/[\s\t\n\r]+/mu', ' ', html_entity_decode($var));