编辑:我现在有点白痴了,因为我实际上在问题中包括了错误的表达。正确的表达式是/^([ \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 Smith
,Henry O'Conner
,Jé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不支持/ path /中偏移量为44的\ L,\ l,\ N {name},\ U或\ u(请参见编辑)5第21行的to / file.php
致命错误:第48行的/path/to/file.php中的名称无效
坦白说,我对RegEx知之甚少,也不清楚这是怎么回事。一点研究表明,JS和PHP都将RegEx基于Perl语法,因此它们并没有太大区别,尽管存在一些差异,这就是为什么它会被打破。如何将其转换为在PHP中工作?是否有某种自动转换器?
其他人也遇到过类似的问题,但是由于他们的问题是特定于正则表达式的,所以我看不到如何在RegEx中使用该信息。
有人能指出我正确的方向吗?
最佳答案
正则表达式的问题是\u1234
匹配javascript中的Unicode字符1234,但是此语法在PCRE中无效。 PCRE中正确的语法为\X{1234}
。当您匹配一系列unicode字符时,请按以下方式更改正则表达式:
/^[ \X{00c0-01ff}a-zA-Z'\.\-]+$/
请注意,我使用
\X{00c0-01ff}
来匹配该范围内的任何unicode字符。我还删除了捕获组,因为对于匹配的字符串中的每个字符都有一个捕获组是没有意义的。如果在将javascript正则表达式转换为PCRE正则表达式时遇到其他问题,This documentation可能会有所帮助。