我想下载一个网站,将该网站上的所有链接替换为内部链接。
这很简单:
$page=file_get_contents($url);
$local=$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'];
$page=preg_replace('/href="(.+?)"/','href="http://'.$local.'?href=\\1"',$page);
但是我想要排除所有css文件和js文件,所以我尝试了:
$regex='/href="(.+?(?!(\.js|\.css)))"/';
$page=preg_replace($regex,'href="http://'.$local.'?href=\\1"',$page);
但是没有用,
我做错了什么?
我想是?!
是一个负向前瞻
答案 0 :(得分:5)
要回答您的regex问题,您需要在那里进行观察并更好地限制与角色类的匹配:
$regex = '/href="([^"]+(?<!\.js|\.css))"/';
charclass首先匹配整个链接内容,然后断言这不会在.js
或.css
中结束。
您可能希望使用<a\s[^>]*?
扩展整个匹配,因此它实际上只是找到任何看起来像链接的内容。
另一种选择是使用domdocument或querypath来执行此类任务,这通常是单调乏味且代码更多,但更简单的方法是将编程条件添加到:
htmlqp->find("a") FOREACH $a->attr("href", "http:/...".$a->attr("href"))
// would need a real foreach and an if and stuff..