[英]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.