作者lin1987www (林奕忠)
看板RegExp
标题Re: [问题] 请帮忙解一个Regex,取代子字串的问题
时间Thu May 8 21:08:26 2014
※ 引述《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://webptt.com/cn.aspx?n=bbs/RegExp/M.1399554510.A.B99.html