2009-11-30 20 views
1

我在我的网站上有以下代码。它用于在一个没有http://或/前面的html块中查找图像。如果是这种情况,它会将网址添加到图片源的前面。PHP和正则表达式:将网站网址添加到图像

例如:

<img src="http://domain.com/image.jpg"> will stay the same 
<img src="/image.jpg"> will stay the same 
<img src="image.jpg"> will be changed to <img src="http://domain.com/image.jpg"> 

我觉得我的代码确实是低效的...我如何可以把它用更少的代码运行的任何想法?

preg_match_all('/<img[\s]+[^>]*src\s*=\s*[\"\']?([^\'\" >]+)[\'\" >]/i', $content_text, $matches); 
if (isset($matches[1])) { 
    foreach($matches[1] AS $link) { 
    if (!preg_match("/^(https?|ftp)\:\/\//sie", $link) && !preg_match("/^\//sie", $link)) { 
     $full_link = get_option('siteurl') . '/' . $link; 
     $content_text = str_replace($link, $full_link, $content_text); 
    } 
    } 
} 

回答

6

一开始,你可以停止使用正则表达式来处理HTML,特别是当你在做什么是如此容易与HTML解析器(其中PHP具有至少3)完成。例如:

$dom = new DomDocoument; 
$dom->loadHTML($html); 
$images = $dom->getElementsByTagName('img'); 
foreach ($images as $image) { 
    $src = $image->getAttribute('src'); 
    $url = parse_url($src); 
    $image->setAttribute('src', http_build_url('http://www.mydomain.com', $url); 
} 
$html = $dom->saveHTML(); 

问题解决了。好吧,差不多。将主机名添加到相对URL而不是以/开头的主机名的情况有点令人困惑,并且不在此片段中处理,但是这是一个相对较小的更改(它涉及检查$url['path'])。

参见Parse HTML With PHP And DOMDocument Object Modelparse_url()http_build_url()。 PHP比正则表达式有更好的工具。

哦,好的措施请阅读Parsing Html The Cthulhu Way

0

尝试使HTML与正则表达式匹配非常困难。

即使您的代码似乎可以正常工作,但由于某些IMG代码不符合您所描述的确切格式,因此很可能会漏掉一些IMG代码。

0

这不是测试,但我想这样的事情...

preg_match_all('/<img\b[^>]*\bsrc\s*=\s*[\'"]?([^\'">]*)/i', $content_text, $matches); 
4

也许完全不同的方法可以工作,太:

<base href="http://domain.com/" />

+0

哦男人。我从来不知道这个标签。感谢您发布对它的引用。 – 2009-11-30 08:22:29