编辑:我现在感觉有点像白痴,因为我实际上在问题中包含了错误的表达。正确的表达式是/^([ \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 不支持 \L、\l、\N{name}、\U 或 \u在/path/中的偏移量
44(参见编辑) 5第 21 行的 to/file.php致命错误:第 48 行/path/to/file.php中的名称无效
坦率地说,我对 RegEx 知之甚少,也不知道这里出了什么问题。一些研究表明,JS 和 PHP 的 RegEx 都基于 Perl 语法,因此它们并没有太大的不同,尽管存在一些差异,这就是它崩溃的原因。如何将其转换为在 PHP 中工作?那里有某种自动转换器吗?
其他人也有类似的问题,但因为他们的问题是特定于他们的正则表达式的,所以我看不到如何在我的 RegEx 中使用这些信息。
有人可以指出我正确的方向来转换它吗?