Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/255.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 带尾随的非单词字符_Php_Regex_Pcre - Fatal编程技术网

Php 带尾随的非单词字符

Php 带尾随的非单词字符,php,regex,pcre,Php,Regex,Pcre,我需要使用PHP的preg_replace从字符串末尾去除任何非字母数字字符: 单词一,二,,单词一,二,[space],单词一,二,,单词一,二都应该变成单词一,二 我试过preg_replace('/(.+)\\W+$/'、'$1'、'Word One,Two,')但这只会去除最后一个非单词字符。我还尝试了“/(.+)\\W*$/”,因为我认为如果找到0或1个非单词字符(如我所需),这将使它工作,但它根本不匹配。我想我需要使\W贪婪,但我不确定如何做到。有什么想法吗?另外,请随时向我解释我做

我需要使用PHP的preg_replace从字符串末尾去除任何非字母数字字符:

单词一,二,
单词一,二,[space]
单词一,二,
单词一,二
都应该变成
单词一,二


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

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

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

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

使用

相反。这样就避免了问题,只需替换尾随的非单词字符,甚至不尝试匹配其他字符

另一个选择是

preg_replace('/(.+?)\\W+$/', '$1', $foo);
这将为捕获组使用惰性量词(
+?
)。这个量词在尽可能少地匹配的同时尝试满足匹配(与我们上面看到的尽可能多地匹配的
+
相反)。但如果你能避免的话,我通常会避免自己替换比赛的部分。要从字符串中删除内容,您当然不需要匹配比需要删除更多的内容。

顺便说一句,这是一个很好的学习资源。对于许多事情,regex引擎如何运行的内部工作原理也有详细的解释。
preg_replace('/(.+?)\\W+$/', '$1', $foo);