剥离尾随非单词字符

时间:2012-06-15 09:32:06

标签: php regex pcre

我需要使用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正则表达式标签; - )

2 个答案:

答案 0 :(得分:1)

你的正则表达式正在寻找任何角色的最大可能数量,同时仍然至少保留一个非单词。

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

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

答案 1 :(得分:1)

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

使用

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

代替。这样就可以通过替换尾随的非单词字符来避免这个问题,甚至不用尝试匹配别的东西。

另一种选择是

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

将使用 lazy 量词(+?)作为捕获组。这个量词尝试满足匹配,同时尽可能少地匹配 (而不是试图尽可能多地匹配+ ,如上所述)。但一般来说,如果你能避免,我会避免自己更换部分比赛。要从字符串中剥离内容,您当然不需要匹配超出需要的内容。