【问题标题】:PHP Regular expression - Remove all non-alphanumeric charactersPHP 正则表达式 - 删除所有非字母数字字符
【发布时间】:2013-05-01 20:59:45
【问题描述】:

我使用 PHP。

我的字符串可能是这样的

This is a string-test width åäö and some über+strange characters: _like this?

问题

有没有办法删除非字母数字字符并用空格替换它们?以下是一些非字母数字字符:

  • -
  • +
  • _
  • ?

我已经阅读了很多关于它的主题,但它们不支持其他语言,比如这个:

preg_replace("/[^A-Za-z0-9 ]/", '', $string);

要求

  • 我的无字母字符列表可能不完整。
  • 我的内容包含不同语言的字符,例如 åäöü。可能更多。
  • 非字母数字字符应替换为空格。否则这个词会粘在一起。

【问题讨论】:

    标签: php regex utf-8 replace


    【解决方案1】:

    我不完全确定您使用的是哪种正则表达式。但是,POSIX 正则表达式允许您表达一个字母类,其中 [:alpha:] 表示任何字母字符。

    那就试试吧:

    preg_replace("/[^[:alpha:]0-9 ]/", '', $string);
    

    实际上,我忘记了 [:alnum:] - 这使它更简单:

    preg_replace("/[^[:alnum:] ]/", '', $string);
    

    【讨论】:

      【解决方案2】:

      您是否在寻找\W

      类似:

      /[\W_]*/
      

      匹配所有非字母数字字符和下划线。

      \w 匹配所有单词字符(字母、数字、下划线)

      \W 匹配不在\w 中的任何内容。

      因此,\W 匹配任何非字母数字字符,并且您添加下划线,因为 \W 不匹配下划线。

      编辑:这使您的代码行变为:

      preg_replace("/[\W_]*/", ' ', $string);
      

      ' ' 表示所有匹配的字符(不是字母也不是数字)都将变成空格。

      重新编辑:您可能还想使用另一个 preg_replace 来删除所有连续的空格并将它们替换为单个空格,否则您最终会得到:

      This is a string test width     and some  ber strange characters   like this 
      

      你可以使用:

      preg_replace("/\s+/", ' ', $string);
      

      如果有的话,最后修剪开始和结束的空格。

      【讨论】:

        【解决方案3】:

        你可以试试这个:

        preg_replace('~[^\p{L}\p{N}]++~u', ' ', $string);
        

        \p{L} 代表所有字母字符(无论是什么字母)。

        \p{N} 代表数字。

        带有 u 修饰符的主题字符串被视为 unicode 字符。

        或者这个:

        preg_replace('~\P{Xan}++~u', ' ', $string);
        

        \p{Xan} 包含 unicode 字母和数字。

        \P{Xan} 包含所有非 unicode 字母和数字。 (请注意,它也包含空格,您可以使用 ~[^\p{Xan}\s]++~u 保留)

        如果您想要一组更具体的允许字母,您必须将 \p{L} 替换为 unicode table 中的范围。

        例子:

        preg_replace('~[^a-zÀ-ÖØ-öÿŸ\d]++~ui', ' ', $string);
        

        为什么在这里使用所有格量词 (++)?

        ~\P{Xan}+~u 会给你与~\P{Xan}++~u 相同的结果。这里的区别在于,在第一个引擎记录每个回溯位置(我们不需要),而在第二个它不记录(如在原子组中)。结果是很小的业绩利润。

        我认为在可能的情况下使用所有格量词和原子组是一种很好的做法。

        但是,PCRE 正则表达式引擎在明显的情况下会自动使量词具有所有格(例如:a+b => a++b),除非 PCRE 模块已使用选项 PCRE_NO_AUTO_POSSESS 编译。 (http://www.pcre.org/pcre.txt)

        有关所有格量词和原子组here (possessive quantifiers)here (atomic groups)here 的更多信息

        【讨论】:

        • 这个。但是,根据字符串的不同,可能需要包含\X
        • @CasimiretHippolyte 感谢这篇文章,它帮助我分配了我喜欢你的正则表达式 preg_replace('~[^a-zÀ-ÖØ-öÿŸ\d]++~ui', ' ', $string );但我想知道如何在字符串中添加“_”下划线和“-”连字符以保留
        • @MoisesZaragoza:如果要保留这些字符,只需将它们添加到字符类,因为它是负字符类(由于开头^,只有字符没有类中存在的匹配和替换)。所以~[^a-zÀ-ÖØ-öÿŸ\d_-]++~ui~[^\p{L}\p{N}_-]++~u~[^\p{Xan}_-]++~u
        • @MoisesZaragoza:请注意,对于 Ruby,您可以使用 \p{alnum}(用于所有 unicode 字母和数字)和类交集:[\P{alnum}&&[^_-]]
        【解决方案4】:

        \p{xx} 是你要找的,我相信,see here

        那么,试试吧:

        preg_replace("/\P{L}+/u", ' ', $string);
        

        【讨论】:

        • 但这不是用空格替换了 OP 想要保留的所有字母字符吗?
        • 这不应该替换任何字母字符,不(注意大写P)。
        • 哦,对了。但是,数字字符呢?它们是否包含在L 中?我不确定文档中的“修饰符字母”或“其他字母”是什么意思。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-03
        • 1970-01-01
        • 2012-01-10
        • 2020-01-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多