关于使用正则表达式将URL转换为链接

时间:2012-08-23 02:36:09

标签: php regex

我需要将文章中的网址转换为3g域名。

例如,我需要转换

  

这里是链接:http://www.mydomain.com/index谢谢

  

这是链接:<a href='http://3g.mydomain.com$4' target='_self'>http://3g.$3.com$4</a> thanks

不要转换其他域,只是mydomain。这是代码:

$c = "/([^'\"=])?http:\/\/([^ ]+?)(mydomain)\.com([A-Za-z0-9&%\?=\/\-\._#]*)/";
$b=preg_replace($c, "$1<a href='http://3g.$3.com$4' target='_self'>http://3g.$3.com$4</a>",$b);

效果很好,但如果文字是这样的话:

<a href="http://www.mydomain.com/44" target="_blank" class="blue">a link</a>

它会返回错误的结果:

<a href="<a href='http://3g.mydomail.com/44' target='_self'>http://3g.mydomain.com/44</a>" target="_blank" class="blue">a link</a>

但我需要

的结果
<a href="http://3g.mydomain.com/44" target="_blank" class="blue">a link</a>

我该怎么办?

2 个答案:

答案 0 :(得分:1)

您应该执行以下操作:

  1. 从现有超链接中删除目标属性
  2. 重写href属性中的超链接
  3. 重写任何其他超链接

    $ plain =“http://([^] +?)(mydomain)\。com(/?[^'\”\ s] *(?= ['\“\ s]))”;

    $ plain_replace =“http://3g.$3.com$4”;

    $ in_href =“href =(['\”])“+ plain +”(['\“])”;

    $ in_href_replace =“href ='http://3g. $ 3.com $ 4'target ='self'”;

    $ strip_target =“target = ['\”] [^'\“] * ['\”]“;

    ...

  4. 所以:

    1. 将$ strip_target替换为“”

    2. 将$ in_href替换为$ in_href_replace

    3. 将$ plain替换为$ plain_replace

    4. (正在使用C#对正则表达式进行测试,您可能需要调整\ escaping以适应php正则表达式规则。)

答案 1 :(得分:0)

摆脱正则表达式中的第一个?。这允许缺少前面的字符。

或者,或许更符合您的意图,如果您想在开头允许网址,则可以替换:

([^'\"=])?

使用:

(^|[^'\"=])

...如果在开始时允许链接,或者如果之前没有引号等,则允许链接,但不允许。