使用preg_match匹配带有重音符号的字符

5

我在使用php的preg_match时遇到了问题。

我希望我的用户只填写有效字符,例如:不包含数字或特殊字符的名称字段。

我的网站最终将是双语的,但大部分访问者是加拿大法语区的人。

我更喜欢使用utf-8编码。因此,在我的文档顶部,我有这个标签:

<meta charset="utf-8" />

我需要在表单中接受带有重音的字符,我已经尝试过以下方法:

(preg_match('/^\p{L}+$/ui',$string))

但是我无法通过这种方式接受口音。

以下是一个名字可能包含字符的示例:

jean-françois d'abiguäel

这几乎是最糟糕的情况了。

似乎每个人都能够使 (preg_match('/^\p{L}+$/ui',$string)) 正常工作,只有我不行。

我需要像这样的东西:

/^\p{L}(\p{L}+[- ']?)*\p{L}$/ui

但我需要让它正常工作。

我的服务器是IIS(godaddy) PHP版本为5.4 默认时区设置为America/Montreal

谢谢!


这是一个真实的名字,为什么要打破它呢? - user557846
添加 ini_set('default_charset', 'UTF-8'); - Wiktor Stribiżew
取决于重音字符如何嵌入文档中。例如,à可以是U+0061 + U+0300(带有重音的基本字母a),也可以是U+00E0(带重音的a)。\p{L}匹配“字母”,这就是0061和00E0所归类的,而00E0是“标记”,不匹配\p{L}。由于您的正则表达式只允许“字母”,如果您的字符串是字母+标记,则标记会导致整个字符串不匹配。 - Marc B
太多了,我现在要回去看《迷失》了。 - MadeInDreams
@ZeroG:小心,不要迷失自己。 - Casimir et Hippolyte
显示剩余2条评论
3个回答

5
这个模式应该是可行的:
/^\pL+(?>[- ']\pL+)*$/u

演示

但是您可以根据需要为更奇特的名称进行调整(例如带有尾随引号或撇号的名称)。


1
这也是我的,你之前发过了。我在一两秒后想出了^\p{L}+(?:[-\h']\p{L}+)*$ - Wiktor Stribiżew
2
它也匹配“Père Noël”,它必须是正确的;-) - Jan
如果 ((preg_match("/^\pL+(?>[- ']\pL+)*$/u",$string)) == true) { } 這樣寫不會接受任何內容。也許我調用它的方式有誤。 - MadeInDreams
1
它不会匹配“Charles de Batz-Castelmore d’Artagnan”。 - Jan
1
@Jan:因为你使用的是撇号(而不是单引号)。 - Casimir et Hippolyte
显示剩余3条评论

2
~^([\p{L}-\s']+)$~ui

匹配以下名称:

  1. Jean-François d'Abiguäel
  2. François Hollande
  3. Père Noël

regex 101上查看演示。


1
这个正则表达式允许两端有空格。事实上,它允许 --- - --- - Wiktor Stribiżew
2
@stribizhev:我会跟随你的意见,我的答案有严重的缺陷,我会投票支持Casimir的。 - Jan
哈哈,谢谢你帮我减轻了负担,我一度感到很糟糕。最糟糕的是,我的工作和我的 IF 语句中的条件相反了。当实际上是好请求时,却显示为坏请求。 - MadeInDreams

0

实际上,您可以这样缩短@Casimir et Hippolyte的答案:

/^\pL+([- ']\pL+)*$/u

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