Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/248.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP正则表达式:什么是;在偏移量0“处分级;?_Php_Regex - Fatal编程技术网

PHP正则表达式:什么是;在偏移量0“处分级;?

PHP正则表达式:什么是;在偏移量0“处分级;?,php,regex,Php,Regex,我试图使用一个简单的正则表达式和php preg_replace函数从字符串中去除所有标点符号,尽管我得到以下错误: 编译失败:仅在偏移量为0的类中支持POSIX命名类 我想这意味着我不能在偏移量为0的类之外使用POSIX命名类。我的问题是,当它说“在偏移量为0的类内”时意味着什么 expect包含分隔符。所以试试这个: preg_replace('/[[:punct:]]/', ' ', $string) 注意:PHP的PCRE实现不需要g修饰符 此外,使用g修饰符替换所有出现的标点符号:

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

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

我想这意味着我不能在偏移量为0的类之外使用POSIX命名类。我的问题是,当它说“在偏移量为0的类内”时意味着什么

expect包含分隔符。所以试试这个:

preg_replace('/[[:punct:]]/', ' ', $string)

注意:PHP的
PCRE
实现不需要
g
修饰符

此外,使用
g
修饰符替换所有出现的标点符号:

preg_replace('/[[:punct:]]/g', ' ', $string)
//                         ^
来自(见评论):

解释为什么会出现这个错误:PCRE使用Perl对分隔符的松散定义。外部的
[]
看起来像是有效的分隔符,导致它将
[:punct::][/code>作为regex部分读取


(哦,如果可以的话,请避免使用
ereg
函数-它们不会包含在PHP5.3中。)

我只是按照其中一个答案中的建议将g添加到regexp中,它的效果与预期的相反,并且没有过滤掉标点符号,原来preg_replace不需要g,因为它首先是全局/递归的

很抱歉没有标记,我在标记这个问题时遇到了一个错误。“无法添加新标记,请使用现有标记”。”。。我怎么知道那是什么意思?我把标签修好了。我认为您的程序中存在一个bug:您的意思是回声发生在if块的外部还是内部?我认为您需要一定程度的声誉来创建一个新标记。但是错误信息很差。也许你可以建议更改下面列出的UserVoice反馈站点。太棒了,这不仅解决了我的问题,而且我还学到了一些关于preg_*工作原理的新知识。谢谢:)我对正则表达式的复杂性还不太熟悉,“特别地”g的定义是什么?从你说过的话中,我假设这是一种告诉regexp是递归的方式?@chris:它的意思是“全局”——即查找所有现有的匹配项。没有它,正则表达式函数将在第一次匹配后停止搜索。@Lonowski,谢谢;我已经用您的信息更新了我的答案。/g表示全局,它告诉regex替换所有实例。回声“怎么了?”| sed“s/[:punct:][]/“怎么了?”?echo“怎么了?”| sed“s/[[:punct:][]///g”怎么了,但斯特拉格错了。preg_replace是/default/global。echo preg_替换('/[:punct:]/',''“怎么了?”);在这方面,PHP实现并没有真正遵循Perl标准。preg_replace()函数总是替换所有匹配项。对于我正在做的事情,有没有替代ereg_replace的方法?@chris,他说ereg。您正在使用preg_替换。您还使用了@Ant所说的eregi(在这种情况下,这实际上是不必要的)。对不起,零浓度时刻。我明白他现在在说什么了。
preg_replace('/[[:punct:]]/g', ' ', $string)
//                         ^
> [The g modifier] means "Global" -- i.e., find all existing matches. Without it, regex functions will stop searching after the first match.