推 bigair :<p><strong>([\S\s]+?)<\/strong><br \/> 11/06 16:14
推 bigair :全部都要的話: 11/06 16:28
→ bigair :/<p><strong>([\S\s]+)<\/strong><br \/>/g 11/06 16:28
→ bigair :打錯 /<p><strong>([\S\s]+?)<\/strong><br \/>/g 11/06 16:28
承蒙 bigair 的指導,對 RegExp 又多了一些認識,在此整理一下我的心得。
這個問題的關鍵就在於正規表示法有所謂的「貪婪(greedy)」演算法,
會自動取符合條件的最大 pattern 來做處理。
解決方法就如 birair 前輩說的那樣,也可以參考這個網頁瞭解更詳細的說明:
http://deer.nublog.cc/article.php?i=20080225
另外想補充一下我查到的東西,關於 regex pattern 最後的那個 /g,
英文叫做 modifier,我查到比較詳細的說明,請見這個網頁的說明:
http://www2.stack.ru/~julia/PHP4/pcre.pattern.modifiers.html
對於其他可用的 modifier 有比較完整的說明。
根據我實際操作的結果和這個網頁所說的,似乎並沒有 g 這個 modifier,
會出現 Unknown modifier 'g' 的錯誤訊息,
不過就我的問題來說,其實只要用 ungreedy 模式就可以解決了。
這個問題解決之後,在測試時意外又發現一個問題,想要再度請教一下。
同樣舉個例子:
<?php
${1} = '<p>a<br /><br />b<br /><br />c</p><p>d<br /><br />e</p>';
${1} = preg_replace('/>([\S\s]+)<br \/><br \/>/U',
'>$1</p><p>', ${1});
echo ${1};
?>
先說明一下,上面用到的一個 U modifier,其實是 ungreedy 模式的另一種寫法,
和使用 +? 的寫法是相同意思的。
我的問題在於,如果有紅色的 >,那麼出來的結果就只會取代一次最小的 pattern,
如果沒有紅色的 >,那麼跑出來的結果就會取代掉所有符合的最小 pattern,
為什麼會這樣呢?又如果我想要取代全部,又想要保留那個紅色的 >,又該怎麼寫呢?
※ 編輯: chweng 來自: 218.165.33.54 (11/07 13:55)