如何使用preg_replace追加或替换尾随问号?

Fre*_*ing 2 php regex preg-replace

我想在字符串和字符串处强制执行单个问号.在JavaScript中它完美地运作:

var re = /[?7!1]*$/;
document.write('lolwut'.replace(re, '?'));
document.write('lolwut?'.replace(re, '?'));
document.write('lolwut??'.replace(re, '?'));
document.write('lolwut???'.replace(re, '?'));
document.write('lolwut???!!!11'.replace(re, '?'));
Run Code Online (Sandbox Code Playgroud)

所有返回的值都等于"lolwut?" PHP变体不能顺利运行:

$re = '/[?7!1]*$/';
echo preg_replace($re, '?', 'lolwut') . "\n";
echo preg_replace($re, '?', 'lolwut?') . "\n";
echo preg_replace($re, '?', 'lolwut??') . "\n";
echo preg_replace($re, '?', 'lolwut???') . "\n";
echo preg_replace($re, '?', 'lolwut???!!!11') . "\n";
Run Code Online (Sandbox Code Playgroud)

输出是:

lolwut?
lolwut??
lolwut??
lolwut??
lolwut??
Run Code Online (Sandbox Code Playgroud)

我在这里做错了什么?


更新:

$(美元)断言字符串结尾
断言是对当前匹配点之后或之前的字符的测试,该字符实际上不消耗任何字符.

这是我的困惑,以及preg_replace的隐含全局标志,感谢salathe提供线索.(你们应该投票给他的答案,真的)

Liz*_*ard 7

结帐rtrim()- http://php.net/manual/en/function.rtrim.php

echo rtrim('lolwut','?7!1').'?'; // lolwut?
echo rtrim('lolwut?','?7!1').'?'; // lolwut?
echo rtrim('lolwut??','?7!1').'?'; // lolwut?
echo rtrim('lolwut???!!!11','?7!1').'?'; // lolwut?
echo rtrim('lolwut1??!7!11','?7!1').'?'; // lolwut?
Run Code Online (Sandbox Code Playgroud)

rtrim会 Strip whitespace (or other characters) from the end of a string

第二个论点:

您还可以通过charlist参数指定要删除的字符.只需列出要删除的所有字符.使用..,您可以指定一系列字符.