2009-11-30 19 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