我需要使用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正则表达式标签; - )
答案 0 :(得分:1)
你的正则表达式正在寻找任何角色的最大可能数量,同时仍然至少保留一个非单词。
您需要做的只是删除(.+)
,然后使用:
preg_replace("/\W+$/","",$input);
答案 1 :(得分:1)
这是因为(.+)
会占用所有其他字符,包括非字字符。正则表达式引擎开始匹配字符串,并从捕获组中的所有字符开始。只有这时它才会注意到字符串末尾的\W
不适合和备份,暂时允许单个字符与\W
匹配。但是只需要一个字符就可以满足\W+
,所以它只是停止并且只删除那个单个字符。这也是(.+)\W*$
完全不起作用的原因,因为\W*
满足于根本没有匹配。
使用
preg_replace('/\\W+$/', '', $foo);
代替。这样就可以通过替换尾随的非单词字符来避免这个问题,甚至不用尝试匹配别的东西。
另一种选择是
preg_replace('/(.+?)\\W+$/', '$1', $foo);
将使用 lazy 量词(+?
)作为捕获组。这个量词尝试满足匹配,同时尽可能少地匹配 (而不是试图尽可能多地匹配的+
,如上所述)。但一般来说,如果你能避免,我会避免自己更换部分比赛。要从字符串中剥离内容,您当然不需要匹配超出需要的内容。