2013-10-10 63 views
0

我有一個例子:如何在php的img標籤上使用preg_replace類和src?

<a href="http://test.html" class="watermark" target="_blank"> 
    <img width="399" height="4652" src="http://test.html/uploads/2013/10/10.jpg" class="aligncenter size-full wp-image-78360"> 
</a> 

我使用的preg_replace改變值類img標籤

$content = preg_replace('#<a(.*?)href="([^"]*/)?(([^"/]*)\.[^"]*)"([^>]*?)><img(.*?)src="([^"]*/)?(([^"/]*)\.[^"]*)"([^>]*?)></a>#', '<a href=$2$3 class="fancybox"><img$1src="http://test.html/uploads/2013/10/10_new.jpg"></a>', $content); 

的標籤和src怎樣的結果?

<a href="http://test.html" class="fancybox" target="_blank"> 
    <img width="399" height="4652" src="http://test.html/uploads/2013/10/10_new.jpg" class="aligncenter size-full wp-image-78360"> 
</a> 

回答

1

正則表達式,因爲每天在這裏SO多次提及,不是HTML操作的最佳工具 - 幸運的是我們有DOMDocument對象!如果您使用的是完整的文檔HTML源

$orig = ' <a href="http://test.html" class="watermark" target="_blank"> 
       <img width="399" height="4652" src="http://test.html/uploads/2013/10/10.jpg" class="aligncenter size-full wp-image-78360"> 
     </a>'; 
$doc = new DOMDocument(); 
$doc->loadHTML($orig); 
$anchor = $doc->getElementsByTagName('a')->item(0); 
if($anchor->getAttribute('class') == 'watermark') 
{ 
    $anchor->setAttribute('class','fancybox'); 
    $img = $anchor->getElementsByTagName('img')->item(0); 
    $currSrc = $img->getAttribute('src'); 
    $img->setAttribute('src',preg_replace('/(\.[^\.]+)$/','_new$1',$currSrc)); 
} 
$newStr = $doc->saveHTML($anchor); 

否則:

$orig = '<!DOCTYPE html> 
<html> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
    <title></title> 
</head> 
<body> 
    <a href="http://test.html" class="watermark" target="_blank"> 
     <img width="399" height="4652" src="http://test.html/uploads/2013/10/10.jpg" class="aligncenter size-full wp-image-78360"> 
    </a> 
    <span>random</span> 
    <a href="http://test.html" class="watermark" target="_blank"> 
     <img width="399" height="4652" src="http://test.html/uploads/2013/10/10.jpg" class="aligncenter size-full wp-image-78360"> 
    </a> 
    <a href="#foobar" class="gary"> 
     <img src="/imgs/yay.png" /> 
    </a> 
</body> 
</html>'; 
$doc = new DOMDocument(); 
$doc->loadHTML($orig); 
$anchors = $doc->getElementsByTagName('a'); 
foreach($anchors as $anchor) 
{ 
    if($anchor->getAttribute('class') == 'watermark') 
    { 
     $anchor->setAttribute('class','fancybox'); 
     $img = $anchor->getElementsByTagName('img')->item(0); 
     $currSrc = $img->getAttribute('src'); 
     $img->setAttribute('src',preg_replace('/(\.[^\.]+)$/','_new$1',$currSrc)); 
    } 
} 
$newStr = $doc->saveHTML(); 

雖然大腦

如果你只用該字符串提供可以進行更改,像這樣練習,我已經提供了一個正則表達式解決方案,因爲這是原始問題,並且有時候 DOM文檔可能會導致代碼量過大(儘管更優選)

$newStr = preg_replace('#<a(.+?)class="watermark"(.+?)<img(.+?)src="(.+?)(\.[^.]+?)"(.*?>.*?</a>)#s','<a$1class="fancybox"$2<img$3src="$4_new$5"$6',$orig); 
0

Don't parse HTML with regex.

查找HTML有watermark類,變更類fancybox所有鏈接,並更新的第一個孩子圖像src

$dom = new DOMDocument; 
@$dom->loadHTML($html); 
$xpath = new DOMXPath($dom); 
foreach ($xpath->query('//a[contains(@class, "watermark")]') as $a) { 
    $a->setAttribute('class', 'fancybox'); 

    $img = $xpath->query('descendant::img', $a)->item(0); 
    # old value = $img->getAttribute('src'); 
    $img->setAttribute('src', 'new_value'); 
} 
echo $dom->saveHTML();