PHP匹配控制字符但不是空格?

时间:2012-03-03 10:26:45

标签: php regex

使用POSIX字符类

如何匹配[:cntrl:]但不包括[:space:]?

$message =  ereg_replace("[[:cntrl:]]", "", $message);

2 个答案:

答案 0 :(得分:5)

ereg_ *(POSIX)函数现已被弃用了很长时间。你不应该继续使用这些方法。

根据POSIX Bracket Expressions [:cntrl:]解析为ASCII范围[\x00-\x1F\x7F](或unicode \p{Cc})和[:space:]解析为[ \t\r\n\v\f]。使用asciitable.com解析这些字符,您将获得[\x20\x09-\x0D]的排除列表。 “做数学”你留下了[\x00-\x08\x0E-\x1F\x7F]。并留下以下内容,PHP 5.3和向上兼容,清理:

$message = preg_replace('/[\x00-\x08\x0E-\x1F\x7F]+/', '', $message);

请注意,VT(垂直标签)和FF(表单Feed,新页面)也会保留。根据您的具体情况,您可能也想删除它们:

$message = preg_replace('/[\x00-\x08\x0E-\x1F\x7F\x0A\x0C]+/', '', $message);

答案 1 :(得分:0)

[[:cntrl:]]基本上是[\x00-\x1f\x7F][[:space:]]相当于[ \t\r\n\v\f] (ref),所以长手法就是使用[\x00-\x08\x0E-\x1F\7F] (空格为0x20且超出cntrl范围,\t\r\n\v\f为\ x09到\ x0D)