繁体   English   中英

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

[英]How to append or replace trailing question marks using 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, '?'));

所有返回的值都等于“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??

我在这里做错了什么?


更新:

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

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

Checkout 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?

rtrim将从Strip whitespace (or other characters) from the end of a string删除Strip whitespace (or other characters) from the end of a string

第二个论点:

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

只是回答问题(“我在这里做错了什么?”),你对正则表达式的精确匹配感到困惑。 在显示字符串时,禁止第一个,正则表达式实际匹配两次 ,这就是为什么你得到两个问号(两个匹配,两个替换)。 这种行为的根源是量词( *允许不匹配)和结束锚( $匹配字符串结尾)的混合。

对于lolwut???!!!11

  • 正则表达式首先匹配???!!!11这是你所期望的
  • 给字符串一个lulwut?的新值lulwut?
  • 然后它也匹配新字符串末尾的点
  • 导致lulwut??的最终替换值lulwut??

如果你想继续使用preg_replace使用相同的正则表达式,那么只需通过向第四个( $limit )参数提供值1来将其限制为一个替换:

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

至于其他人所说的更好的解决方案,请使用rtrim

你应该使用trim功能:

echo trim('lolwut???!!!11', '?7!1');

输出是:

lolwut

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM