【问题标题】:Strip trailing non-word character(s)去除尾随非单词字符
【发布时间】:2012-06-15 09:32:06
【问题描述】:

我需要使用 PHP 的 preg_replace 去除字符串末尾的所有非字母数字字符:

Word One, Two, -Word One, Two,[space]Word One, Two,Word One, Two 都应该变成Word One, Two

我试过preg_replace('/(.+)\\W+$/', '$1', 'Word One, Two, -');,但这只会去掉最后一个非单词字符。我还尝试了'/(.+)\\W*$/',因为我认为如果找到 0 或 1 个非单词字符(如我需要),这将使它工作,但它根本不匹配。我想我需要让\W 变得贪婪,但我不知道怎么做。有任何想法吗?另外,请随时向我解释我做错了什么,这样我就不会发现自己困扰着 SO 正则表达式标签 ;-)

【问题讨论】:

    标签: php regex pcre


    【解决方案1】:

    这是因为(.+) 吞噬了所有其他字符,包括非单词字符。正则表达式引擎开始匹配字符串,并从捕获组中的 all 个字符开始。只有这样它才注意到字符串末尾的\W 不适合并备份,暂时允许单个字符与\W 匹配。但是满足\W+ 只需要一个字符,因此它会停止并删除该单个字符。这也是(.+)\W*$ 根本不起作用的原因,因为\W* 满足于根本不匹配。

    使用

    preg_replace('/\\W+$/', '', $foo);
    

    相反。这通过替换尾随的非单词字符而无需尝试匹配其他字符来避免该问题。

    另一种选择是

    preg_replace('/(.+?)\\W+$/', '$1', $foo);
    

    它将为捕获组使用 lazy 量词 (+?)。这个量词尝试在匹配尽可能的同时满足匹配(与我们上面看到的试图匹配尽可能+相反)。但一般来说,如果你能避免的话,我会避免自己更换部分比赛。要从字符串中删除内容,您当然不需要匹配更多内容。

    【讨论】:

    • regular-expression.info 是一个很好的学习资源,顺便说一句。对于许多事情,这里也详细解释了正则表达式引擎如何运行的内部工作原理。
    【解决方案2】:

    您的正则表达式正在做的是寻找任何字符的最大可能数量,同时仍然在末尾保留至少一个非单词。

    您需要做的只是删除(.+),然后使用:

    preg_replace("/\W+$/","",$input);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-15
      • 1970-01-01
      • 1970-01-01
      • 2018-12-21
      • 1970-01-01
      相关资源
      最近更新 更多