2

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

4

2 回答 2

2

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

采用

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

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

另一种选择是

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

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

于 2012-06-15T09:34:18.063 回答
1

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

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

preg_replace("/\W+$/","",$input);
于 2012-06-15T09:33:59.107 回答