【问题标题】:Regex to reject non-english characters?正则表达式拒绝非英文字符?
【发布时间】:2011-06-06 19:38:13
【问题描述】:

是否有一个简单的正则表达式可以捕获所有非英语字符?它需要允许常见的标点和符号,但不允许使用俄语、日语等特殊字符。

正在寻找可以在 PHP 中工作的东西。

【问题讨论】:

  • 为什么要限制为英文字符,但允许所有标点符号‽ 您真的要限制输入为 ASCII 字符吗?
  • @Anon - 姓名和地址通常包括撇号、逗号、句号等。想要规范化数据,以便一切都是英文。

标签: php regex unicode


【解决方案1】:

由于您在评论中提到地址,因此它们也可能包含数字。所以:

preg_replace('/[^[:alpha:][:punct:][:digit:]]/u', utf8_encode($input), '');

应该替换你不需要的字符。不过,[:alpha:] 类只有在您的语言环境设置正确的情况下才能工作。例如,如果将其设置为de_DE,则不仅“a”到“z”被视为字符,而且“ä”、“ö”、“è”等“异国情调”。

此外,由于您不想要“俄语、日语等”,请注意 u 修饰符。输入必须是 UTF-8 编码,以免破坏它并给您错误的结果。

【讨论】:

    【解决方案2】:

    比如这个[^A-Za-z0-9\,\.\-]?

    【讨论】:

    • "I'm breaking your regex."一起玩吧。
    • ,,.- 不需要在字符组内转义。当然不是,,因为它在正则表达式中没有特殊含义。
    【解决方案3】:

    【讨论】:

      【解决方案4】:

      使用hex codes,例如这会清除所有非 ascii 字符以及行尾,并用空格替换它们。空格 (\x20) 被故意排除在范围之外,以便将连续运行的空格和/或特殊字符替换为单个空格。

      $clean = trim(preg_replace('/[^\x21-\x7E]+/', ' ', $input));
      

      【讨论】:

        【解决方案5】:
        if (strlen($str) == strlen(utf8_decode($str))) {
        
        }
        

        【讨论】:

        • 不确定这实际上如何解决所提出的问题。一些解释会很好。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多