PHP正则表达式:什么是“偏移0的类”?

时间:2009-01-24 00:13:26

标签: php regex

我试图使用简单的正则表达式和php preg_replace函数从字符串中删除所有标点符号,但我收到以下错误:

  

编译失败:仅在偏移量为0的类中支持POSIX命名类

我想这意味着我不能在偏移0处的类之外使用POSIX命名类。我的问题是,当它表示“在偏移0的类中”时它意味着什么?

$string = "I like: perl";    

if (eregi('[[:punct:]]', $string))  
    $new = preg_replace('[[:punct:]]', ' ', $string); echo $new;

4 个答案:

答案 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>