我想下载一个网站,将该网站上的所有链接替换为内部链接.
这很简单:
$page=file_get_contents($url);
$local=$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'];
$page=preg_replace('/href="(.+?)"/','href="http://'.$local.'?href=\\1"',$page);
Run Code Online (Sandbox Code Playgroud)
但我想排除所有css文件和js文件,所以我尝试:
$regex='/href="(.+?(?!(\.js|\.css)))"/';
$page=preg_replace($regex,'href="http://'.$local.'?href=\\1"',$page);
Run Code Online (Sandbox Code Playgroud)
但那没用,
我究竟做错了什么?
我想
?!
Run Code Online (Sandbox Code Playgroud)
是一个负面的先行
要回答你的正则表达式问题,你需要一个lookbehind那里,并更好地限制与字符类匹配:
$regex = '/href="([^"]+(?<!\.js|\.css))"/';
Run Code Online (Sandbox Code Playgroud)
charclass首先匹配整个链接内容,然后断言这不会以.js或结束.css.你可能想用<a\s[^>]*?even 来扩充整个匹配,所以它真的只是找到任何看起来像链接的东西.
另一个选择是使用domdocument或querphath来执行此类任务,这通常是单调乏味和更多代码,但更简单的方法是将编程条件添加到:
htmlqp->find("a") FOREACH $a->attr("href", "http:/...".$a->attr("href"))
// would need a real foreach and an if and stuff..
Run Code Online (Sandbox Code Playgroud)