【问题标题】:Regex that checks upper or lower case characters with or without accents正则表达式检查带或不带重音的大写或小写字符
【发布时间】:2010-07-17 11:20:22
【问题描述】:

如何让以下正则表达式忽略所有个空格?

$foo = ereg_replace("[^áéíóúÁÉÍÓÚñÑa-zA-Z]", "", $_REQUEST["bar"]);

输入: Ingeniería Eléctrica'*;

电流输出: IngenieríaEléctrica

所需输出: Ingeniería Eléctrica

我尝试添加 /s \s\s* \s+ /\s+/ /s /t /r 等等,但都失败了。

目标: 一个正则表达式,它只接受带有或不带有(西班牙)重音的大写或小写字符的字符串。

谢谢!

【问题讨论】:

    标签: php regex web-applications web


    【解决方案1】:

    我认为没有理由将 \s 添加到该正则表达式中不起作用。 \s 应该匹配所有的空白字符。

    $foo = preg_replace("/[^áéíóúÁÉÍÓÚñÑa-zA-Z\s]/", "", $_REQUEST["bar"]);
    

    【讨论】:

    • bleh,自从我使用 PHP 以来已经有一段时间了。感谢您的提醒,已更新答案:)
    【解决方案2】:

    我相信这应该可行

    $foo = ereg_replace("[^áéíóúÁÉÍÓÚñÑa-zA-Z ]", "", $_REQUEST["bar"]);
    

    【讨论】:

    • ereg_replace() 已弃用,您确实应该建议切换到 preg_replace()
    • 所以...简单... ~.~ 谢谢!
    • @mark 是的,你是对的,但我只是想纠正错误而不做任何其他事情
    【解决方案3】:

    ereg_replace 使用 POSIX Extended Regular Expressions 并且在那里使用 POSIX bracket expressions

    现在要知道的重要一点是,在括号表达式中,\ 不是元字符,因此 \s 不起作用。

    但是你可以在POSIX括号表达式中使用POSIX字符类[:space:]来达到同样的效果:

    $foo = ereg_replace("[^áéíóúÁÉÍÓÚñÑa-zA-Z[:space:]]", "", $_REQUEST["bar"]);
    

    你看,它不同于我认为更广为人知的 Perl 语法,并且由于 POSIX 正则表达式函数在 PHP 5.3 中已被弃用,你真的应该使用与 Perl 兼容的函数。

    【讨论】:

      【解决方案4】:

      到目前为止,所有答案都没有指出您匹配重音字符的方法是一种 hack 并且不完整 - 例如,没有匹配重音。

      最好的方法是使用mbstring扩展:

      mb_regex_encoding("UTF-8"); //or whatever encoding you're using
      var_dump(mb_ereg_replace("[^\\w\\s]|[0-9]", "", "Ingeniería Eléctrica'*;<42", "z"));
      

      给予

      string(22) "Ingeniería Eléctrica"

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-12-16
        • 1970-01-01
        • 1970-01-01
        • 2023-04-06
        • 2021-09-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多