0

我正在使用这个正则表达式来接受重音字符

/^([\p{L}a-zA-Z ,-]*)$/i

当我在这个网站上测试我的正则表达式时:http ://rubular.com/r/MRESYEGO2d 一切正常,但是当我在我的 php 中使用相同的正则表达式时它不起作用。

$alphaNumCity = "/^([\p{L}a-zA-Z0-9 ,-]*)$/i";
if (preg_match($alphaNumCity, $champ)) {
    echo "<label for='tags'>Villes<span style='color:red;'>*</span></label><input id='tags' name='businessVille' value='".$champ."' required />";
} else {
    echo "<label for='tags'>Villes<span style='color:red;'>(entrer un nom de ville valide)*</span></label><input id='tags' name='businessVille' required />";
    $valide = false;
}

这段代码在 else 中。

我不明白为什么它在这里工作http://rubular.com/r/MRESYEGO2d而不是在我的代码中?

4

2 回答 2

1

使用unicode 标志(或 unicode 修饰符):

/^([\p{L}a-zA-Z ,-]*)$/iu
于 2013-09-30T16:55:02.310 回答
1

unicode 标志 "u",/^([\p{L}a-zA-Z0-9 ,-]*)$/iu带有一些注释:

关于使用 /u 模式修饰符时 UTF-8 字符串的有效性,需要注意一些事项;

  1. 如果模式本身包含无效的 UTF-8 字符,则会出现错误(如上面的文档中所述 - “自 PHP 4.3.5 开始检查模式的 UTF-8 有效性”

  2. 当主题字符串包含无效的 UTF-8 序列/代码点时,它基本上会导致 preg_* 函数“安静地死亡”,其中没有匹配但没有指示字符串是无效的 UTF-8

  3. PCRE 认为 5 个和 6 个八位字节的 UTF-8 字符序列是有效的(在模式和主题字符串中),但是 Unicode 不支持这些(参见“Linux 和 Unix 安全编程”的第 5.9 节“字符编码”-可以可在 http://www.tldp.org/和其他地方找到)

  4. 有关测试 UTF-8 字符串有效性(并丢弃 5/6 个八位字节序列)的 PHP 示例算法,请访问: http: //hsivonen.iki.fi/php-utf8/

有关代码示例和更多信息,请参阅文档:http ://www.php.net/manual/en/reference.pcre.pattern.modifiers.php#54805

于 2013-09-30T16:57:30.137 回答