PHP Regular Expression将内部链接更改为绝对链接

时间:2011-12-08 14:01:37

标签: php regex curl anchor

我在PHP中寻找一个正则表达式,当它们是内部时,可以替换锚标签的href属性和IMG,样式,脚本等的src属性。

一个例子:如果我正在查看页面http://www.mysite.com并在该页面上有一张图片:

<img src="/images/picture.gif />然后我希望能够将其更改为:

<img src="http://mysite.com/images/picture.gif />

锚标记的相同之处:<a href="otherpage.php" >foo</a>应更改为

<a href="http://mysite.com/otherpage.php" >foo</a>

此外,它应该能够处理具有src=href=属性的其他元素,并且它应该对具有一个或多个其他属性的元素起作用(例如{{ 1}})

我试过像

这样的东西
<img class="test" src="/images/picture.gif alt="some picture" />

但是效果不好。它采用了src属性,但它也捕获了src之后的所有属性。此外,它没有捕获不以/(例如preg_replace("/src=[\"']([\/])(.*)?[\"'] /", "src='".$domain."/$2'", $htmldata);

开头的字符串

4 个答案:

答案 0 :(得分:3)

我建议将它们保留为“内部”链接,只需添加HTML base tag即可。希望您的预期用途允许此解决方案。

编辑:我(@ManseUK)将链接更改为w3.org网站而不是 w3schools w3fools.com - 希望你不介意....

答案 1 :(得分:2)

使用U修饰符更改贪婪并允许零前导斜杠:

 /(?:src|href)\s*=\s*[\"\'](?:\/*)([\w\.]*)[\"\']/U

...因为你不需要src | href或前导斜杠作为反向引用,匹配但是省略它们?:

然后,图像名称变为$ 1而不是$ 2.

我在整个模式中使用U修饰符是因为,什么时候?否则出现在?:中我不需要额外的粒度,我的眼睛看得更清楚。

虽然正如其他人所指出的那样,通过正则表达式做这件事可能不是最好的答案......:)

答案 2 :(得分:0)

尝试这种模式

(src|href)\s*=\s*[\'\"]\/(.*?)[\'\"]

答案 3 :(得分:0)

$url = 'http://domain.com/';
$result = preg_replace('/(?<=href=[\'"]|src=[\'"])\/?/', $url.'$1', $input);