【问题标题】:preg_match unicode does not work with some languagespreg_match unicode 不适用于某些语言
【发布时间】:2013-08-04 22:18:19
【问题描述】:

用这个正则表达式无法验证以下语言的文本​​​:

/^[\p{L}\p{Nd}-_.]{1,20}$/u

不起作用的语言:

Bengali, Gujarati, Hindi, Marathi, Thai, Tamil, Telugu, Vietnamese

与 PHP 的 preg_match 一起使用时。

我错过了什么?

【问题讨论】:

  • 为什么在正则表达式中有这些空格?如果这是为了便于阅读,请使用 /x 修饰符。
  • @RohitJain:如果他在反斜杠和p 等之间放置空格,即使这样也行不通。
  • @TimPietzcker。啊!当然。错过了。

标签: php regex unicode internationalization


【解决方案1】:

您错误地使用了破折号。如果您希望它与文字短划线字符匹配,则需要对其进行转义 (\-) 或将其放在字符类的末尾。

另外,我不熟悉这些语言,但我想您可能还需要考虑分数:

/^[\p{L}\p{Nd}\p{M}_.-]{1,20}$/u

【讨论】:

【解决方案2】:

问题不在于您的正则表达式(除了字符- 必须始终位于字符类的开头或结尾)。请注意,您的模式可以缩短为:

/^[\w.-]{1,20}$/u

/^[\p{Xan}.-]{1,20}$/u

如果要去掉下划线

【讨论】:

  • 在 PHP 中,即使使用 /u 选项,\w 也只会匹配 [A-Za-z0-9_]。如果您希望它与[\p{L}\p{Nd}_] 匹配,则必须以(*UCP) 开始正则表达式,强制它通过Unicode 属性而不是查找表匹配:/(*UCP)^[\w.-]{1,20}$/u。这同样适用于\d\s\b,以及相反的:\W\D\S\B
猜你喜欢
  • 1970-01-01
  • 2016-05-02
  • 2022-11-11
  • 1970-01-01
  • 2019-03-28
  • 2018-09-22
  • 1970-01-01
  • 2020-09-12
  • 1970-01-01
相关资源
最近更新 更多