JavaScript中的RegExp会在PHP中引发错误

时间:2013-08-04 11:49:34

标签: php javascript regex

编辑:我觉得自己有点像白痴,因为我实际上在问题中包含了错误的表达方式。正确的表达式是/^([ \u00c0-\u01ffa-zA-Z'\.\-])+$/,尽管它仍会抛出相同的错误(偏移量为5,而不是44)。

我使用以下正则表达式来使用JavaScript验证名称:

<击> /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i

(这是取自Stack Overflow的答案,虽然我很难找到提供链接的原始问题,但我很害怕)..

我在将名称发送到服务器之前使用它来验证名称,但显然他们需要在服务器上重新验证,因为其他方式将数据发送到服务器(数据最终输入到MySQL数据库中)。

它在JavaScript中非常有效,允许我输入各种名称,例如John SmithHenry O'ConnerJérémie Dent-O'Brien。但是,在将RegExp复制到PHP(使用以下代码)时,它会抛出错误,如下所示。

$nameRegEx = "[that expression from above]";
$r = $_POST["r"];
if(preg_match($nameRegEx,$r)){
    // do MySQL stuff
}else{
    trigger_error("Invalid name",E_USER_ERROR); // Obviously I won't use this in
                                                // the final script as it is
                                                // very un-user-friendly
                                                // (is that a word?)
}
  

警告:preg_match()[function.preg-match]:编译失败:PCRE不支持\ L,\ l,\ N {name},\ U或\ u偏移 44 /path/to/file.php 中的(参见编辑) 5

     

致命错误:第48行 /path/to/file.php 中的名称无效

坦率地说,我对RegEx知之甚少,并且不知道这里出了什么问题。一些研究表明,JS和PHP都将它们的RegEx基于Perl语法,因此它们并没有太大差异,尽管存在一些差异,这就是为什么它会破坏。如何将其转换为PHP工作?那里有某种自动转换器吗?

其他人也有过类似的问题,但由于他们的问题是针对他们的正则表达式而特定的,所以我看不出如何在我的RegEx中使用这些信息。

有人能指出我正确的方向转换它吗?

1 个答案:

答案 0 :(得分:2)

你的正则表达式的问题是\u1234匹配javascript中的unicode字符1234,但这种语法在PCRE中无效。 PCRE中的正确语法是\X{1234}。当您匹配一系列unicode字符时,请按以下方式更改正则表达式:

/^[ \X{00c0-01ff}a-zA-Z'\.\-]+$/

请注意,我使用\X{00c0-01ff}来匹配该范围内的任何unicode字符。我还删除了捕获组,因为匹配字符串中的每个字符都有一个捕获组,这一点毫无意义。

如果在将javascript正则表达式转换为PCRE正则表达式时遇到其他问题,

This documentation可能会有所帮助。