代码之家  ›  专栏  ›  技术社区  ›  cnandreu

检查有重音或无重音的大写或小写字符的正则表达式。

  •  1
  • cnandreu  · 技术社区  · 16 年前

    如何使下面的正则表达式忽略 全部的 白色空间?

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

    输入: Ingenier_­a el_©Ctrica'*;<42

    电流输出: Ingenier_ael_)携程

    期望输出: Ingenier_a el_)携程

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

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

    谢谢您!

    4 回复  |  直到 16 年前
        1
  •  3
  •   Chris    16 年前

    我看不出为什么要增加 \s 对那个雷杰克斯来说是行不通的。 的S 应匹配所有空白字符。

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

    我相信这应该管用

    $foo = ereg_replace("[^áéíóúÁÉÍÓÚñÑa-zA-Z ]", "", $_REQUEST["bar"]);
    
        3
  •  0
  •   Felix Kling    16 年前

    ereg_replace 使用 POSIX Extended Regular Expressions 在那里, POSIX bracket expressions 被使用。

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

    但是可以使用posix字符类 [:space:] 在posix括号表达式中实现相同的效果:

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

    你看,它不同于,我认为,更著名的Perl语法,而且由于在php 5.3中POSIX正则表达式函数被弃用,你真的应该使用与Perl兼容的函数。

        4
  •  0
  •   Artefacto    16 年前

    到目前为止,所有的答案都没有指出,你匹配重音字符的方法是一种黑客行为,而且它是不完整的,例如,没有匹配严重的重音。

    最好的方法是使用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"