php preg_match用西里尔字符获取单词

时间:2014-09-05 15:21:14

标签: php regex

我尝试从字符串中获取一些单词,但这个单词可能会有西里尔字符,我试图得到它,但我所做的就是 - 不工作。

请帮帮我; 我的代码

  $str= "Продавец:В KrossАдын рассказать друзьям  var addthis_config = {'data_track_clickback':true};";
$pattern = '/\s(\w*|.*?)\s/';
preg_match($pattern, $str, $matches);
echo $matches[0];

我需要KrossАдын

Thaks!

2 个答案:

答案 0 :(得分:2)

您可以使用u修饰符更改\w的含义。使用u修饰符,字符串将被读取为UTF8字符串,而\w字符类不再是[a-zA-Z0-9_],而是[\p{L}\p{N}_]

$pattern = '/\s(\w*|.*?)\s/u';

请注意,模式中的替换是无意义的:

你使用一个替代,第二个成员可以匹配第一个成员相同的东西。 (即\w*匹配的所有内容都可以由.*?匹配,因为右边有一个空格。这两个子模式将匹配两个空格之间的字符)

撰写$pattern = '/\s(.*?)\s/u';完全相同或更好:

$pattern = '/\s(\S*)\s/u';

避免使用惰性量词。

如果您的目标只是匹配ASCII和西里尔字母,那么效率最高(因为对于字符类越小越快):

$pattern = '~(*UTF8)[a-z\p{Cyrillic}]+~i';

(*UTF8)将通知正则表达式引擎必须将原始字符串读取为UTF8字符串。

\p{Cyrillic}是一个只包含西里尔字母的字符类。

答案 1 :(得分:1)

问题是你的字符串使用UTF-8字符,\ w将不匹配。在StackOverflow上查看此答案以获得解决方案:UTF-8 in PHP regular expressions

基本上,您需要在表达式的末尾添加u修饰符,并使用\p{L}代替\w