我在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);