用于替换除css和js之外的所有链接的正则表达式

时间:2011-12-06 11:52:06

标签: php regex

我想下载一个网站,将该网站上的所有链接替换为内部链接。

这很简单:

$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);

但是没有用,

我做错了什么?

我想是

?!

是一个负向前瞻

1 个答案:

答案 0 :(得分:5)

要回答您的问题,您需要在那里进行观察并更好地限制与角色类的匹配:

$regex = '/href="([^"]+(?<!\.js|\.css))"/';

charclass首先匹配整个链接内容,然后断言这不会在.js.css中结束。 您可能希望使用<a\s[^>]*?扩展整个匹配,因此它实际上只是找到任何看起来像链接的内容。

另一种选择是使用来执行此类任务,这通常是单调乏味且代码更多,但更简单的方法是将编程条件添加到:

htmlqp->find("a") FOREACH $a->attr("href", "http:/...".$a->attr("href"))
// would need a real foreach and an if and stuff..