2016-07-23 121 views
0

我试图找到一个正则表达式,可以将相对于绝对的curl'ed文档的所有URL更改。将相对URL更改为绝对URL Curl

我发现的其中一种方法是发布here,但它只适用于第一个URL,并非全部。

这是代码我使用:

$url="http://www.example.com"; 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL,$url); 
curl_setopt($ch, CURLOPT_FAILONERROR, 1);             
curl_setopt($ch, CURLOPT_DNS_USE_GLOBAL_CACHE, 0);        
curl_setopt($ch, CURLOPT_DNS_CACHE_TIMEOUT, 60);         
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);           
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);            
$result=curl_exec($ch); 
curl_close($ch); 
$result = preg_replace('~(href|src)=(["\'])(?!#)(?!http://)([^\2]*)\2~i','$1="http://www.example.com$3"', $result); 
echo $result; 

我在哪里做错了吗?

编辑 只是为了更好地解释。我没有一个url数组,但是我有一个从curl中收集的整个文档,所以我需要一个preg替换方法。

+0

[Transfrom相对路径成绝对URL使用PHP(的可能的复制http://stackoverflow.com/questions/4444475/transfrom-relative-path -into-absolute-url-using-php) –

+0

你可以用RamenChef的建议修改来实现这种方式,但可能会更加健壮,如http://stackoverflow.com/questions/4444475/transfrom-相对路径 - 到 - 绝对网址使用的PHP。 –

+0

谢谢,但是如果我有一个url数组,那么这个url就可以工作。在这种情况下,我需要在html文件中替换 – Luca

回答

1

我不确定为什么它只替换一次(也许它与反向引用有关),但是当你将它包装在while循环中时,它应该可以工作。

$pattern = '~(href|src)=(["\'])(?!#|//|http)([^\2]*)\2~i'; 
while (preg_match($pattern, $result)) { 
    $result = preg_replace($pattern,'$1="http://www.example.com$3"', $result); 
} 

(I也稍微改变的模式。)

+0

太棒了!有用!!真的非常感谢 – Luca