代码如下:
$value="http:www.domain1.com [IMG]http:www.domain2.com[/IMG] [URL=http://www.domain3.com]http:www.domain2.com[/URL]";
$str = eregi_replace("http://([a-zA-Z0-9.-:?=&\-]*)","[URL]\\0[/URL]",$value);
这种形式会得到结果如下:
[URL]http://www.domain1.com[/URL] [IMG][URL]http://www.domain2.com[/URL][IMG]
而我希望得到的结果是:
[URL]http://www.domain1.com[/URL] [IMG]http://www.domain2.com[IMG] [URL=http://www.domain3.com]http://www.domain3.com[/URL]";
domain2和domain3的不予转换。
请问eregi_replace()里的正则表达式要怎么样写才好?我试了很久都搞不好。
---------------------------------------------------------------
一种可能的写法:
1
2$value="http://www.domain0.com[IMG]http://www.domain2.com[/IMG] [URL=http://www.domain3.com]http://www.domain3.com[/URL] http://www.domain1.com";
3
4// 提取将要排除的标记
5preg_match_all("/\\[(\w+).*\\].+\\[\/\\\1\\]/iU",$value,$regs);
6// 构造替换数组
7foreach($regs[0] as $k=>$v) {
8$p[$k] = " ¦".preg_quote($v)." ¦";
9$r[$k] = "`$k`";
10}
11// 替换掉要排除的标记
12$value = preg_replace($p,$r,$value);
13// 对余下的做替换
14$value = preg_replace(" ¦http://([a-zA-Z0-9.-:?=&-]*) ¦i","[URL]\\\0[/URL]",$value);
15// 准备复原
16foreach($regs[0] as $k=>$v) {
17$p[$k] = "/$r[$k]/";
18$r[$k] = $v;
19}
20// 恢复要排除的标记
21$value = preg_replace($p,$r,$value);
22
23echo $value;