1

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

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

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

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

4

4 回答 4

1

我想知道是否可以对组进行这样的量词。

preg_replace('/(\s|	| )+/mu', ' ', $var)

编辑

是的,这似乎有效:

$str='  t 	     e 	  	  	  s	t	  ';

echo '|'.preg_replace('/(\s|	| )+/mu',' ',$str).'|';

^ 产生预期的结果:| t e s t |

于 2012-08-19T16:55:12.313 回答
0

你可以先做一个html解码,然后应用正则表达式,结束然后再次编码

像这样的东西:

$result = htmlentities(preg_replace('/[\s\t\n\r]+/mu', ' ', html_entity_decode($var)));
于 2012-08-19T16:41:11.317 回答
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;

于 2012-08-20T06:40:09.800 回答
-1

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

preg_replace('/[\s\t\n\r]+/mu', ' ', html_entity_decode($var));
于 2012-08-19T16:36:14.410 回答