[請益] 正規表示法的問題(已修改,敬請指教)

看板PHP作者時間17年前 (2008/11/06 15:03), 編輯推噓2(202)
留言4則, 1人參與, 最新討論串1/1
<?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
<p><strong>([\S\s]+?)<\/strong><br \/>
11/06 16:14, 1F

11/06 16:28, , 2F
全部都要的話:
11/06 16:28, 2F

11/06 16:28, , 3F
/<p><strong>([\S\s]+)<\/strong><br \/>/g
11/06 16:28, 3F

11/06 16:28, , 4F
打錯 /<p><strong>([\S\s]+?)<\/strong><br \/>/g
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)
文章代碼(AID): #194fQggG (PHP)
文章代碼(AID): #194fQggG (PHP)