2010-07-20 47 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