使用正则表达式处理俄语文本

11

我无法用正则表达式解决我的问题。

好的,当我输入:

$string = preg_replace("#\[name=([a-zA-Z0-9 .-]+)*]#","$name_start $1 $name_end",$string);

除了俄语之外,一切都正常。

所以,我尝试重新输入这个正则表达式:

$string = preg_replace("#\[name=([a-zA-Z0-9**а-яА-Я** .-]+)*]#","$name_start $1 $name_end",$string);

但是这不起作用,

我知道一些想法,只需写:

$string = preg_replace("#\[name=([a-zA-Z0-9йцукенгшщзхъфывапролджэячсмитьбю .-]+)*]#","$name_start $1 $name_end",$string);

但这太疯狂了 :D

请给我简单的方式


请分享更多细节,例如样本输入字符串以及与这些字符串对应的期望输出。 - Nico Haase
4个回答

19

尝试使用Unicode范围:

'/[\x{0410}-\x{042F}]/u'  // matches a capital cyrillic letter in the range A to Ya
不要忘记为 Unicode 使用 /u 标志。
在你的情况下:
"#\[name=([a-zA-Z0-9\x{0430}-\x{044F}\x{0410}-\x{042F} .-]+)*]#u"
请注意,你的正则表达式中的星号是多余的。一切都已经被加号所"吃掉"了。以下内容可以达到相同效果:
"#\[name=([a-zA-Z0-9\x{0430}-\x{044F}\x{0410}-\x{042F} .-]+)]#u"

代码难以阅读,这是不好的!代码必须简单易读 :) - bmalets
我认为你想表达的是\x{0401}-\x{042f},这是俄语单词的Unicode范围。A确实是俄语字母表中的第一个字母,但不在Unicode范围内。可以在这里查看Unicode表。 - Iulian Onofrei
@Iulian Onofrei,是的,我确实看到\x{0401}在里面,但没有看到范围\x{0402}-\x{0409}。那么应该是[\x{0401}\x{0410}-\x{042F}],还是真的[\x{0401}-\x{042F}]?当然可以自由编辑! - Bart Kiers
@BartKiers,是的,你说得对。我错过了那个。我认为正确的解决方案是:[\x{0430}-\x{044F}\x{0451}] 用于小写字母和 [\x{0401}\x{0410}-\x{042F}] 用于大写字母。 - Iulian Onofrei

7

常见的Unicode脚本(自pcre 3.3以来支持)提供了一个测试属性Cyrillic

例如,替换所有既不是Cyrillic也不是(拉丁)数字的字符:

$string = '1a2b3cйdцeуfкбxюy';
echo preg_replace('/[^0-9\p{Cyrillic}]/u', '*', $string);

您可以在http://www.pcre.org/pcre.txt "Unicode字符属性"下找到该功能的文档。
并且,您需要按照http://docs.php.net/reference.pcre.pattern.modifiers中描述的指定PCRE8标志(u)。


据我所知,在“常规”脚本和手动指定范围之间没有(技术上的)区别。因此,这只是一个选择问题。除了属性名称可能更具自我记录性之外。 - VolkerK

0

这个对我有用:

/^[а-яА-Я\p{Cyrillic}0-9\s\-]+$/ 

我已经在所有浏览器中进行了测试,包括Safari


0

在互联网上使用最广泛的字母之一。

这个功能已经运行了一段时间,我相信是自php 5.6以来。

// Filter Chinese and Japanese HAN
if (preg_match("/\p{Han}+/u", " 余TEST杭丽人广播", $match)){echo "CHINESE, JAPANESE ";}
// Filter Cyrilic
if (preg_match("/\p{Cyrillic}/u", "Күңел радиосы ", $match)){echo "RUSSIAN ";}
// Filter Greek
if (preg_match("/\p{Greek}/u", "Πρακτορείο ", $match)){echo "GREEK ";}
// Filter Arabic
if (preg_match("/\p{Arabic}/u", "مشال راډیو", $match)){echo "ARABIC ";}
// Filter Armenian
if (preg_match("/\p{Armenian}/u", "Ազատություն ", $match)){echo "ARMENIAN ";}
// Filter Thai
if (preg_match("/\p{Thai}/u", "สวท.พะเยา", $match)){echo "THAI ";}
// Filter Georgian
if (preg_match("/\p{Georgian}/u", "რადიო თავისუფალი", $match)){echo "GEORGIAN";}

/* Output: */
/* CHINESE, JAPANESE RUSSIAN GREEK ARABIC ARMENIAN THAI GEORGIAN */

请在您的答案中添加一些解释,以便其他人可以从中学习。就我所看到的,OP并没有要求正则表达式来检测语言。 - Nico Haase
这就是重点:无需解释。 - NVRM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接