我需要找到一种可靠的方法来使用 PHP 搜索阿拉伯语单词。我要搜索的文本可能是英语或阿拉伯语,所以英语单词不能破坏系统。
我一直在阅读 PHP 手册和其他一些 Material ,并认为我有一个正确的解决方案,但会感谢一些正则表达式专家的一些意见。
这项任务的一个主要并发症是我不会说或读阿拉伯语单词,也不知道它是如何工作的。
绝对不起作用的一件事是 \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。你认为我用我的正则表达式实现了这一点吗?非常感谢
最佳答案
我尝试回答后视和前瞻部分。(?<!a)SomeWord
是一个否定的lookbehind,即如果 SomeWord 前面没有“a”,它将匹配。SomeWord(?!a)
是一个否定的前瞻,即如果 SomeWord 后面没有“a”,它将匹配。\p{Arabic}
匹配包含阿拉伯字母的代码点(我自己从未使用过)。见 http://www.regular-expressions.info/unicode.html
所以 (?<!\p{Arabic})SomeArabicWord(?!\p{Arabic})
应该匹配“SomeArabicWord”,即 而不是 前面或后面是一个阿拉伯字母。找到单词边界有什么意义,但我不知道\p{Arabic} 中是否包含标点符号。
如果你想拥有这个,那么使用正面版本: (?<=\p{Arabic})SomeArabicWord(?=\p{Arabic})
关于PHP Regex 查找特定的阿拉伯语关键字,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5817203/