php - 带有触发阿拉伯语的特定特殊字符的正则表达式
问题描述
我有一个用于检测特殊字符的正则表达式。
因为我想不出一个只允许任何字母、空格-
和“,”。喜欢California - USA
Cairo, Egypt
London UK
。
我正在使用的正则表达式:
'/[!@#$%^&*<>();{}[\]_؟:\+=~\/\?\.\\"\']+/'
有许多反斜杠用于转义特殊的正则表达式符号。
但是,它适用于英语 like New York - USA
,但它匹配任何阿拉伯语单词,如القاهرة - مصر
محمد
.
$input = "القاهرة - مصر";
if (preg_match('/[!@#$%^&*<>();{}[\]_؟:\+=~\/\?\.\\"\']+/', $input)) {
echo 'match';
}
为什么它只包含特定字符而匹配阿拉伯字母?
解决方案
您可以使用
preg_match('~^[\p{L}\p{M},\s-]+\z~u', $input)
请参阅正则表达式演示。详情:
^
- 字符串的开始[\p{L}\p{M},\s-]+
- 一个或多个字母 (\p{L}
)、变音符号 (\p{M}
)、逗号、空格 (\s
) 和连字符直到\z
- 字符串的最后。