Php 如何使用preg_replace追加或替换尾随问号?
我想在字符串的和处强制使用一个问号。在JavaScript中,它可以完美地工作: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
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是可行的解决方案。