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

Php 如何使用preg_replace追加或替换尾随问号?,php,regex,preg-replace,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.w

我想在字符串的和处强制使用一个问号。在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, '?'));
所有返回值都等于“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";
输出为:

lolwut?
lolwut??
lolwut??
lolwut??
lolwut??
lolwut
我做错了什么


更新:

$(美元)断言字符串的结尾
断言是对当前匹配点后面或前面的字符的测试,它实际上不使用任何字符


这里是我的困惑,还有preg_replace的隐含全球标志,多亏了salath提供了线索。(你们应该投票支持他的答案,真的)

你们应该使用微调功能:

echo trim('lolwut???!!!11', '?7!1');
输出为:

lolwut?
lolwut??
lolwut??
lolwut??
lolwut??
lolwut
签出
rtrim()
-

rtrim将
从字符串末尾去除空白(或其他字符)

第二个参数:

还可以通过charlist参数指定要删除的字符。只需列出所有要删除的字符。具有可以指定字符的范围


只是为了回答所问的问题(“我在这里做错了什么?”),您对正则表达式匹配的内容感到困惑。除了第一个字符串外,如果字符串出现,正则表达式实际上会匹配两次,这就是为什么会得到两个问号(两次匹配,两次替换)。这种行为的根源是量词(
*
不允许匹配任何内容)和结束锚(
$
匹配字符串的结尾)的混合

对于
lolwut???!!!11

  • 正则表达式首先匹配
    ???!!!11
    这正是您所期望的
  • 为字符串指定一个新值
    lulwut?
  • 然后它也在新字符串末尾的右端匹配
  • 导致最终替换值
    lulwut???
如果您想继续将同一正则表达式与
preg\u replace
一起使用,那么只需通过向第四个(
$limit
)参数提供
1
的值,将其限制为一个替换:

preg_replace('/[?7!1]*$/', '?', 'lolwut???!!!111', 1);
// limit to only one replacement ------------------^ 


至于更好的解决方案,正如其他人所说,使用。

谁使用
7
作为问号??7777@KennyTM:lolwut???!!!11rtrim更合适,但+1是可行的解决方案。