我正在尝试将名字和姓氏与这样的东西相匹配。
$pattern = '/[a-zA-Z\-]{3,30} +[a-zA-Z]+/';
这很有效,除非我有这样的名字Mélissa Smith
我的匹配变为Lissa Smith
如何匹配é
答案 0 :(得分:1)
在javascript中,您可以使用unicode char范围而不是A-Za-z:
"Mélissa Smith".match( /[\u80-\uffff]{3,30} +[\u80-\uffff]+/ )
等于:[“MélissaSmith”]
答案 1 :(得分:0)
使用/u
modifier将正则表达式置于Unicode模式,并使用适当的Unicode character class代替硬编码拉丁字母:
$pattern = '/^(\pL|-){3,30}\s+\pL+$/u';
我还将模式固定在^
和$
之间,否则它最终会匹配您不想要的内容。
你必须记住,当你这样做时,输入(以及模式本身)必须以UTF-8编码。
但是,必须要说天真地解析这样的名字并不能给你带来很好的结果。人们的全名太过于介入这个简单的全面工作。
答案 2 :(得分:-1)
尝试使用POSIX表达式[:alpha:]而不是[a-zA-Z-]来捕捉字符。 [:alpha:]会捕获等效字符,例如重音符号。