PHP正则表达式将内部链接更改为绝对链接


PHP Regular Expression to change internal links to absolute links

我在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=属性,它应该工作在元素,有一个或多个其他属性以及(如<img class="test" src="/images/picture.gif alt="some picture" />)

我试过像

preg_replace("/src=['"'](['/])(.*)?['"'] /", "src='".$domain."/$2'", $htmldata);

,但这并没有很好地工作。它采用src属性,但也捕获了src之后的所有属性。此外,它不能捕获不以/开头的字符串(例如src="image.png")

我建议将它们保留为"内部"链接,并简单地添加一个HTML基标记。希望您的预期用途允许此解决方案。

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

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

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

…因为你不需要src|href或斜杠作为反向引用,所以用?:

匹配但省略它们

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

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

虽然,正如其他人指出的那样,用正则表达式来做这个可能不是最好的正确答案…:)

试试这个模式

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