Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PCRE/PHP中匹配Unicode字母字符_Php_Regex_Unicode_Pcre_Character Properties - Fatal编程技术网

在PCRE/PHP中匹配Unicode字母字符

在PCRE/PHP中匹配Unicode字母字符,php,regex,unicode,pcre,character-properties,Php,Regex,Unicode,Pcre,Character Properties,我正在尝试为PHP中的名称编写一个合理许可的验证器,我的第一次尝试包括以下模式: // unicode letters, apostrophe, hyphen, space $namePattern = "/^([\\p{L}'\\- ])+$/"; 这最终会传递给对preg\u match()的调用。据我所知,这适用于您的香草ASCII字母表,但似乎在使用像Ă或这样的辣字符时出错张. 图案本身有问题吗?也许我期望\p{L}做的工作比我想象的要多 还是与输入的传递方式有关?我不确定它是否相关,

我正在尝试为PHP中的名称编写一个合理许可的验证器,我的第一次尝试包括以下模式:

// unicode letters, apostrophe, hyphen, space
$namePattern = "/^([\\p{L}'\\- ])+$/";
这最终会传递给对
preg\u match()
的调用。据我所知,这适用于您的香草ASCII字母表,但似乎在使用像Ă或这样的辣字符时出错张.

图案本身有问题吗?也许我期望
\p{L}
做的工作比我想象的要多


还是与输入的传递方式有关?我不确定它是否相关,但我确实确保在表单页面上指定UTF8编码。

首先,如果在编写这些代码时使用单撇号而不是双引号,您的生活会容易得多——您只需要一个反斜杠。其次,还应包括组合标记
\pM
。如果您发现一个字符不匹配,请找出它的Unicode代码点,然后您可以使用找出它在哪里。在调试UTF-8属性时,我发现了一个非常有用的工具(在尝试查找之前不要忘记转换为十六进制:
array\u map('dechex',utf8ToUnicode($text))


例如,Ă在Lu中是和,所以我应该匹配它,它确实适合我。另一个角色是,也是,更聪明,确实适合我。您是否有编译的Unicode字符表

我认为问题要简单得多:您忘记指定
u
。Unicode字符属性为

您的正则表达式应该是:

// unicode letters, apostrophe, hyphen, space
$namePattern = '/^[-\' \p{L}]+$/u';

如果要将Unicode
旧模式
替换为
新模式
,则应编写:

$text = preg_replace('/\bold pattern\b/u', 'new pattern', $text);
所以这里的关键是
u
modifier

注意:您的服务器
php版本
至少应为
php4.3.5

如前所述

u(PCRE\u UTF8) 此修饰符打开与Perl不兼容的PCRE的附加功能。模式字符串被视为UTF-8。这 修饰符可从Unix上的PHP4.1.0或更高版本以及PHP中获得 win32上的4.2.3。从PHP4.3.5开始检查模式的UTF-8有效性

谢谢
AgreeOrNot
谁给了我钥匙

我在localhost中尝试过,但在远程服务器中尝试时,它不起作用,然后我发现php.net start在PHP4.3.5中使用了
u
修饰符,我升级了php版本,它可以正常工作

重要的是要知道,这种方法对阿拉伯语用户非常有用(عبي),因为——我相信——unicode是阿拉伯语的最佳编码,如果不使用
u
修饰符,替换将不起作用,请参见下一个示例,它应该适用于您


$text=preg_replace('/\bمحب㶕㶕ك\b/u',NEW',$text)

如果其他人在这里查看,但没有将其付诸实施,请注意,
/u
不会在不同的PHP版本中使用Unicode脚本生成一致的结果

见示例:

相关:



奇怪。试试
$namePattern='/^[\pL]$/'$a=张'; 变量转储(预匹配($namePattern,$a))$a=张1'; 变量转储(预匹配($namePattern,$a))和变体。没有你,这对我来说确实有用。PHP 5.3.2-1ubuntu4。7@chx:给我
int(0)
。您的文件可能没有使用UTF-8进行编码。是的,我使用了回答中显示的utf8ToUnicode例程来验证文件中的代码点。@chx:在这种情况下,我不知道。如果没有修饰符,它对我不起作用,但它对它起作用。由于PHP没有适当的多字节支持,编码问题很常见。是的,只需添加
u
。后续问题:
u
表示什么?由于我没有
u
的模式仍然匹配ASCII,我猜它告诉正则表达式一些关于输入字符串性质的信息,而不是模式本身。
<?php preg_match('/[a-zığüşöç]/u',$title)  ?>