[請益] 正規表示法的問題(已修改,敬請指教)
<?php
${0} = '<p><strong>a</strong><br />b</p><p><strong>c</strong><br />d</p>';
${0} = preg_replace('/<p><strong>([\S\s]+)<\/strong><br \/>/',
'<h2>$1</h2><p>', ${0});
echo ${0};
?>
以上舉一個小小的例子,
我希望輸出的結果是:
<h2>a</h2><p>b</p><h2>c</h2><p>d</p>
不過輸出的結果並不如我願,跑出來的結果是從最大符合的 pattern 開始取代,
可是我希望每一個符合的小 pattern 都可以取代到,這樣不知道該怎麼修正呢?
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.165.32.33
推
11/06 16:14, , 1F
11/06 16:14, 1F
推
11/06 16:28, , 2F
11/06 16:28, 2F
→
11/06 16:28, , 3F
11/06 16:28, 3F
→
11/06 16:28, , 4F
11/06 16:28, 4F
承蒙 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)
PHP 近期熱門文章
PTT數位生活區 即時熱門文章