2016-12-16 88 views
2

我有一篇HTML標籤的文章。這是一個有3/5圖像的長篇文章。現在我想更新每個圖像src的屬性。例如:Preg使用回調代替圖像src

圖片的HTML標記看起來像:

<img class="aligncenter" style="display: block;margin-left:auto;margin-right:auto;" src="http://img.zszywka.com/0/0269/w_0980/moj-swiat/muza-2013-najnowsze-eska-hity-2013-.jpg" width="642" /> 

我想利用這個URL,做出一些改變,並在下一次更新src。然後進入下一張圖片,做一遍(這樣腳本必須改變所有圖像SRC)

最終的img標籤的樣子:

<img class="aligncenter" style="display: block;margin-left:auto;margin-right:auto;" src="http://EXMAPLE.COM/0/0269/w_0980/moj-swiat/muza-2013-najnowsze-eska-hity-2013-.jpg" width="642" /> 

所以我需要在更改操作。我嘗試使用preg_replace_callback但我有一個問題吧:

// change image src 


$finalContent = preg_replace_callback('/' . preg_quote('src="(*.?)"') . '/', 
function() use ($variable_with_changes){ return $variable_with_changes; }, $variable_with_article_content); 

echo $finalContent; 

這不工作,我沒有一個想法,我怎麼可以更新圖像域,並保持路徑。

+0

你好,我嘗試這樣做: –

回答

3

你應該是parsing HTML作爲HTML,不使用正則表達式。

$doc = new DOMDocument(); 
$doc->loadHTML('<html><body><img class="aligncenter" style="display: block;margin-left:auto;margin-right:auto;" src="http://img.zszywka.com/0/0269/w_0980/moj-swiat/muza-2013-najnowsze-eska-hity-2013-.jpg" width="642" /></body></html>'); 
$images = $doc->getElementsByTagName('img'); 
foreach ($images as $img) { 
    $url = $img->getAttribute('src'); 
    // do whatever you need to with $url 
    $url = str_replace('img.zszywka.com', 'example.com', $url); 
    $img->setAttribute('src', $url); 
} 
echo $doc->saveHTML(); 
1

解析答案是更好,但回答你,爲什麼你的正則表達式/ preg_replace_callback失敗的問題...

  1. preg_quote逃脫所有特殊的正則表達式字符,所以不要用你的正則表達式。如果你將變量或未知字符傳遞給你的正則表達式,你會使用它。

  2. *.無效*是一個量詞,表示允許以前的字符/組中的0個或更多個。 .*是你想要的,它意味着零或更多的任何字符,不包括新行。

  3. 你沒有對你找到的匹配做任何事情,你需要將它們傳遞給函數。 function($match)

  4. 你永遠不會交換你的函數中的域名。您可以使用str_replace

PHP實例:

$variable_with_article_content = '<img class="aligncenter" style="display: block;margin-left:auto;margin-right:auto;" src="http://img.zszywka.com/0/0269/w_0980/moj-swiat/muza-2013-najnowsze-eska-hity-2013-.jpg" width="642" />'; 
$finalContent = preg_replace_callback('/' . 'src="(.*?)"' . '/', 
function($match) { return 'src="' . str_replace('img.zszywka.com', 'EXMAPLE.COM', $match[1]) . '"'; }, $variable_with_article_content); 

echo $finalContent; 

演示:https://eval.in/699201

還要注意你的正則表達式沒有要求,即要更換圖像的域。

+0

謝謝! :)作品也很好 –

+0

看看miken32的答案,這是一個更好的方法,這更多的是「正則表達式/回調有什麼問題」 – chris85

-1

我找到了解決方案,效果很好。 :)

function getURL($matches) { 
    global $rootURL; 
    return $matches[1] . $rootURL . "?type=image&URL=" . base64_encode($matches['2']); 
} 

$contents = preg_replace_callback("/(<img[^>]*src *= *[\"']?)([^\"']*)/i", getURL, $contents); 

謝謝大家回覆我!