我需要找到一种可靠的方法来使用PHP搜索阿拉伯语单词。我将要翻译的文本可能是英文或阿拉伯文,因此英文单词不得破坏系统。
我一直在阅读PHP手册和其他一些材料,并认为我有一个正确的解决方案,但对一些正则表达式专家的一些意见表示感谢。
这项任务的一个主要复杂因素是我不会说或读阿拉伯语,或知道它是如何运作的。
绝对不起作用的是\b
边界标记。出于某种原因,这对阿拉伯语文本不起作用(对某些人而言不适用于其他人)。
我的正则表达式是:
/\X(?<!\p{Arabic})(my_arabic_keyword)(?!\p{Arabic})/ui
我的理由是:
\ X修饰符表示可以视为两个单独的unicode字符(字符和重音符号)或单个字符的unicode字符都被考虑在内。
(?<!\p{Arabic})
和(?!\p{Arabic})
部分是为了确保该单词之前或之后的任何内容都是阿拉伯语范围内的unicode字符。我担心我做得不对。首先,它似乎是两侧的匹配空间。哪个好,因为我需要隔离单词,但这让我觉得我还没有真正理解\p{Arabic}
的功能。 是否将我的关键字的一个字符与上面的正则表达式匹配?
也有人建议\p{L}
,但据我所知,这意味着任何字母,所以我不明白这一点。我真的只想替换\b
边界标记,所以我需要匹配空格以及开头和结尾或字符串。
\u
修饰符,我相信PHP必须说它是unicode。
\i
修饰符是使匹配大小写不敏感。我不知道阿拉伯语中是否包含大写字母,或者是否包含大写字母,不区分大小写的修饰符是否会以相同的方式起作用。
所以基本上我想找到具有明确单词边界的特定阿拉伯语关键字,而不使用\b
边界标记(因为它们不起作用)。如果给出英文文本,正则表达式必须中断,但应该返回false。你认为我用我的正则表达式实现了这个吗?
非常感谢
答案 0 :(得分:2)
我试着回答一下后视和前瞻部分。
(?<!a)SomeWord
是一个否定的后视,即如果SomeWord之前没有“a”,它将匹配。
SomeWord(?!a)
是一个消极的预测,即如果SomeWord后面没有“a”,它将匹配。
\p{Arabic}
匹配包含阿拉伯字母的代码点(我自己从未使用过此代码)。见http://www.regular-expressions.info/unicode.html
因此(?<!\p{Arabic})SomeArabicWord(?!\p{Arabic})
应匹配“strongArabicWord”,其中不前面或后面跟着阿拉伯字母。找到单词边界有什么意义,但我不知道是否在\ p {阿拉伯语}中包含了标点符号。
如果你想拥有它,那么请使用正面版本:(?&lt; = \ p {Arabic})SomeArabicWord(?= \ p {Arabic})