2010-07-20 72 views
2

我想在字符串和字符串处强制执行单个问号。在JavaScript中它可以很好地工作:如何使用preg_replace追加或替换尾随问号?

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"; 

输出为:

我在做什么错在这里?


更新:

$(美元)断言串
的端断言是上下面或当前匹配点实际上不消耗任何字符之前的字符的测试。

是我的困惑在这里,与preg_replace函数隐性的全球标志一起,感谢salathe提供线索。 (你们应该投他的答案了,真的)

+1

谁使用'7'作为问号?7777 – kennytm 2010-07-20 08:30:05

+0

@KennyTM:lolwut ??? !!! 11 – 2010-07-20 08:34:26

回答

4

只是为了回答提出的问题(“我做错了什么?”),你是困惑正是的正则表达式匹配的内容。随着字符串提出,禁止第一个,正则表达式实际上匹配两次这就是为什么你会得到两个问号(两个匹配,两个替换)。此行为的根源是量词的混合(*允许无匹配)和末尾锚($匹配字符串的末尾)。

lolwut???!!!11

  • 正则表达式首先匹配???!!!11这是你所期望的
  • 给串lulwut?
  • 那么它也该点就在的结束相匹配的新值新字符串
  • 导致最终替换值为lulwut??

如果你想继续使用相同的正则表达式与preg_replace然后简单地通过第四($limit)的说法提供1值其限制在一个替换:

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

对于一个更好的解决方案,正如其他人所说,使用rtrim

1

你应该使用裁剪功能:

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

输出为:

lolwut 
+0

rtrim会更合适,但+1可用于解决方案。 – 2010-07-20 08:37:10

+0

是我的不好,我也忘了添加'?'最后。 – SirDarius 2010-07-20 08:40:04

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? 

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

第二个参数:

你也可以指定你想要去除的特点,通过参数charlist的手段。只需列出您想要剥离的所有角色。用..你可以指定一个字符范围。

+0

+1,更好的解决方案。 – 2010-07-20 08:37:39