【问题标题】:PHP preg_match: any letter but no numbers (and symbols)PHP preg_match:任何字母但没有数字(和符号)
【发布时间】:2013-12-25 21:28:14
【问题描述】:

我正在尝试为表单中的字段设置验证规则,以检查输入是否仅包含字母。

起初我尝试创建一个函数,如果字符串中没有数字,则返回 true,为此我使用了 preg_match:

function my_format($str)
{
   return preg_match('/^([^0-9])$', $str);
}

无论我看多少次php手册,我似乎都无法理解如何创建我想要的模式。我做的有什么问题?

但我想扩展这个问题:我希望输入文本包含任何字母,但不包含数字或符号,例如问号、感叹号以及您能想象到的所有内容。但我想要的字母不仅是 a-z,我还想要带有各种口音的字母,如西班牙语、葡萄牙语、瑞典语、波兰语、塞尔维亚语、岛语中使用的那些...

我想这不是一件容易的事,而且用 preg_match 很难或不可能做到。是否有任何库可以满足我的确切需求?

【问题讨论】:

  • 输入是 utf-8 吗?所以你想检查一下,如果字符串只包含空格和来自任何语言的任何字母,没有别的?

标签: php regex


【解决方案1】:

如果您使用的是 utf-8 编码输入,请选择 unicode regex。使用u modifier

这将匹配一个仅由字母和任何类型的空白/不可见分隔符组成的字符串:

preg_match('~^[\p{L}\p{Z}]+$~u', $str);

【讨论】:

    【解决方案2】:
    function my_format($str)
    {
       return preg_match('/^\p{L}+$/', $str);
    }
    

    比你想象的要简单!

    \p{L} 匹配来自任何语言的任何类型的字母

    【讨论】:

      【解决方案3】:

      首先,圣诞快乐。

      您与第一个在正确的轨道上,只是缺少一个 + 来匹配一个或多个非数字字符:

      preg_match('/^([^0-9]+)$/', $str);
      

      如您所见,0-9 是一个范围,从数字 0 到 9。这适用于其他一些情况,例如 a-z 或 A-Z,“-”是特殊的,它表示它是一个范围。对于 0-9,您可以使用 \d 的简写形式:

      preg_match('/^([^\d]+)$/', $str);
      

      对于符号,如果您的列表是标点符号。 , " ' ? ! ; : # $ % & ( ) * + - / = @ [ ] \ ^ _ { } | ~,有简写形式。

      preg_match('/^([^[:punct:]]+)$/', $str);
      

      结合你得到:

      preg_match('/^([^[:punct:]\d]+)$/', $str);
      

      【讨论】:

      • 乍一看,您忘记了结束分隔符。
      【解决方案4】:

      使用[:alpha:] POSIX 表达式。

      function my_format($str) {
          return preg_match('/[[:alpha:]]+/u', $str);
      }
      

      额外的[] 将POSIX 转换为由+ 修改的范围,以匹配1 个或多个字母字符。 As you can see, the :alpha: POSIX matches accented characters as well

      如果要包含空格,只需将\s 添加到范围:

      preg_match('/[[:alpha:]\s]+/u', $str);
      

      编辑:抱歉,当我第二次查看您的问题并认为您需要标点符号时,我误读了您的问题。我已经把它拿回来了。

      【讨论】:

      • 谢谢。这很好地提醒我使用 [:alpha:] 而不是 [a-zA-Z]。
      • @myusernamewashijackedhere 干杯!圣诞快乐!
      • 当您使用[[:alpha:]] POSIX 命名类时,您也应该使用u 标志来匹配重音字符,而您没有这样做。
      • @revo 你有这方面的资料吗? u 是否在正则表达式后跟在 / 后面?
      • 我懒得帮你找它,但你可以在网上的某个地方测试它,是的,旗帜最后会跟随/
      猜你喜欢
      • 1970-01-01
      • 2011-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多