Re: [問題] 請幫忙解一個Regex,取代子字串的問題

看板RegExp (正規表示式 Regular Expression)作者 (林奕忠)時間11年前 (2014/05/08 21:08), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串3/3 (看更多)
※ 引述《lin1987www (林奕忠)》之銘言: : ※ 引述《velk14 (sayou)》之銘言: : : 使用語言:PHP preg_replace : : 例句: : : 小明在[place]台灣[/place]耶,[note]小明在[place]台北[/place]的 : : [place]南港[/place]附近[/note],然後小王也在[place]台灣[/place], : : [note]小王在[place]高雄[/place][/note],兩人距離很遠。 : : 解說&目的: : : 1.[place][/place]夾住地名 : : 2.[note][/note]夾住註解 : : 3.現在要把註解內的[place][/place]改成[nplace][/nplace] : : 4.一段註解內可能有很多個地名或是根本沒有地名 : : 5.一篇文章內可能也有很多段註解或是沒有任何註解 : : 要求輸出結果: : : 小明在[place]台灣[/place]耶,[note]小明在[nplace]台北[/nplace]的 : : [nplace]南港[/nplace]附近[/note],然後小王也在[place]台灣[/place], : : [note]小王在[nplace]高雄[/nplace][/note],兩人距離很遠。 : : 目前問題: : : 試了很久一直無法達到要求,常常把小王也在台灣的place改成nplace了, : : 或是被note夾住的place沒有完全變成nplace : : 小弟我對於正規的觀念不是非常清晰,懇請厲害的大大們幫解答謝謝! : 目標是將 [note] 當中 [place] 改成 [nplace]。 : 我的作法需要取代n次,n是根據[note]中的[place]數量做決定。 : 因為每次只取代[note]中的其中一個[place]標籤。 : 想法: : 1.截取 note 的文字 : ------------------ : (\[)(note)(\])((?:.|[\r\n])*?)(\1\/\2\3) : ------------------ : $1$2$3$4$5 : ------------------ : 2.篩選出 note 中有 place 標籤 : ------------------ : (\[)(note)(\])((?:.|[\r\n])*?)(\[)(place)(\]) : ((?:.|[\r\n])*?)(\5)(\/)(\6\7)((?:.|[\r\n])*?)(\1\/\2\3) : ------------------ : $1$2$3$4$5n$6$7$8$9$10n$11$12$13 : ------------------ : 取代格式上前面加個n 使得 [place] 變成 [nplace] : 其格式說明 : http://regex101.com/r/kS4sT6 : 由 1F 提供的註解網址,琢磨數次後才勉強達成 : Finding Comments in Source Code Using Regular Expressions : http://ostermiller.org/findcomment.html 之前的版本取代很慢,所以對效能進行改善 Orz 大量使用 Negative Lookbehind 效能改善 ------------------ (\[note\]) ((?:(?!\[\/note\]|\[place\])(?:.|[\r\n]))*) (?:(\[place\]) ((?:(?!\[\/place\])(?:.|[\r\n]))*) (\[\/place\])) ((?:(?!\[\/note\])(?:.|[\r\n]))*) (\[\/note\]) ------------------ 取代字串,將每次只取代其中一個 place 變成 nplace。 $1$2[nplace]$4[/nplace]$6$7 其格式說明 http://regex101.com/r/qG6bM7 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.134.106.87 ※ 文章網址: http://www.ptt.cc/bbs/RegExp/M.1399554510.A.B99.html
文章代碼(AID): #1JQu7EkP (RegExp)
文章代碼(AID): #1JQu7EkP (RegExp)