我试图使用简单的正则表达式和php preg_replace函数从字符串中删除所有标点符号,但我收到以下错误:
编译失败:仅在偏移量为0的类中支持POSIX命名类
我想这意味着我不能在偏移0处的类之外使用POSIX命名类。我的问题是,当它表示“在偏移0的类中”时它意味着什么?
$string = "I like: perl";
if (eregi('[[:punct:]]', $string))
$new = preg_replace('[[:punct:]]', ' ', $string); echo $new;
答案 0 :(得分:44)
preg_*
functions期望Perl compatible regular expressions有分隔符。所以试试这个:
preg_replace('/[[:punct:]]/', ' ', $string)
答案 1 :(得分:5)
注意:PHP的g
实施不需要PCRE
修饰符!
除了Gumbo's answer之外,请使用g
修饰符替换标点符号的所有:
preg_replace('/[[:punct:]]/g', ' ', $string)
// ^
来自Johnathan Lonowski(见评论):
> [The g modifier] means "Global" -- i.e., find all existing matches. Without it, regex functions will stop searching after the first match.
答案 2 :(得分:1)
解释为什么你得到了这个错误:PCRE使用Perl对分隔符的松散定义。您的外部[]
看起来像是有效的分隔符,导致它将[:punct:]
作为正则表达式部分读取。
(哦,如果可以,请避免使用ereg
函数 - 它们不会包含在PHP 5.3中。)
答案 3 :(得分:0)
我刚刚在其中一个anwers中建议将g添加到regexp中,它与预期的wahts相反,并且DID没有过滤掉标点符号,结果preg_replace不需要g,因为它的全局/递归首先< / p>