preg_replace:bad regex =='Unknown Modifier'?

时间:2011-10-04 19:30:15

标签: php regex warnings preg-replace

我正在编写虚假的电子邮件地址,我只是想确保它们是有效的电子邮件格式,所以我试图删除下面集合中没有的任何字符:

$jusr['email'] = preg_replace('/[^a-zA-Z0-9.-_@]/g', '', $jusr['email']);

我的Windows机器上没有任何问题,但是在linux dev服务器上,每次运行此代码时都会出现此错误:

Warning: preg_replace() [function.preg-replace]: Unknown modifier 'g' in /var/www/vhosts/....

我认为这是正则表达式字符串,但我不能把它固定下来。帮助不大?感谢。

澄清:我不是想要容纳所有有效的电子邮件地址(我的目的不需要),我只需要弄清楚我的preg_replace正则表达式有什么问题。

4 个答案:

答案 0 :(得分:26)

g不是PCRE中的有效修饰符(PHP使用的正则表达式实现),因为它根本不需要;默认情况下,preg_replace()将执行全局替换。您可以在真正的Perl正则表达式和JavaScript正则表达式中找到修饰符,但不能在PCRE中找到。

只需删除g

即可
$jusr['email'] = preg_replace('/[^a-zA-Z0-9.-_@]/', '', $jusr['email']);

答案 1 :(得分:3)

您的PCRE修改器无效。以下是有效PCRE修饰符的列表:

http://us.php.net/manual/en/reference.pcre.pattern.modifiers.php

g(全局)修饰符默认为,因此您不需要它。

答案 2 :(得分:3)

问题是g不是valid PCRE modifier。试着看preg_match_all

答案 3 :(得分:3)

除了/ g之外,正则表达式的内部部分似乎也没有效果:

[^a-zA-Z0-9.-_@]

首先,“^”(这是输入开始的metachar)在[...]内部没有意义(除非你允许包含“^”的电子邮件地址)。其次,短划线应该被转义或放到组的末尾,否则它将被视为范围运算符。最重要的是,您的表达不允许使用各种完全有效的电子邮件地址。检查一些examples