从html编码的字符串中删除空格/垃圾

时间:2012-08-19 16:27:15

标签: php html regex

我制作了一个正则表达式来删除空格和其他垃圾,例如新行和制表符。

preg_replace('/[\s\t\n\r]+/mu', ' ', $var);

但是我的字符串是html编码的,这意味着我将一些字符替换为&#...;

我们还可以做些什么来解释编码的字符?

4 个答案:

答案 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 = "&amp;&#032;&#192;&#12;";

$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,但我为了更短的例子而跳过它。

您可以在中间步骤中展开回调(和正则表达式)或删除命名实体。但请注意,&nbsp;不等同于&#32;,而是&#160;,它是一个可能无法换行的空格宽度不可见字符。其他命名实体也是如此(您通常希望保留&shy;&amp;等。)

答案 3 :(得分:-1)

先使用html_entity_decode(),然后使用preg_replace,例如

preg_replace('/[\s\t\n\r]+/mu', ' ', html_entity_decode($var));