我尝试从字符串中获取一些单词,但这个单词可能会有西里尔字符,我试图得到它,但我所做的就是 - 不工作。
请帮帮我; 我的代码
$str= "Продавец:В KrossАдын рассказать друзьям var addthis_config = {'data_track_clickback':true};";
$pattern = '/\s(\w*|.*?)\s/';
preg_match($pattern, $str, $matches);
echo $matches[0];
我需要KrossАдын。
Thaks!
答案 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
。