2010-03-04 88 views
3

我正在尋找一種方法來查找/替換圖像鏈接(在用戶生成的內容中),而無需觸摸非圖像鏈接。替換<a>鏈接到使用<img>標籤的圖像

例如,以下文字:在PHP

<img src="http://domain.com/image.jpg" alt="Text" /> 
<img src="http://domain.com/arbitrary-file.jpeg" alt="Text" /> 
<img src="http://domain.com/arbitrary-path/arbitrary-file.gif" alt="Text" /> 
<img src="http://domain.com/arbitrary-file.png" alt="Text" /> 

<a href="http://domain.com/arbitrary-file.html">Text</a> 
<a href="http://domain.com/arbitrary-path/">Text</a> 
<a href="http://domain.com/arbitrary-file.html#anchor_to_here">Text</a> 

Non-hyperlinked URL: http://domain.com/arbitrary-path/arbitrary-file.gif 
Non-hyperlinked URL: http://domain.com/arbitrary-file#anchor_to_here 

...安全,可靠:

<a href="http://domain.com/arbitrary-file.jpg">Text</a> 
<a href="http://domain.com/arbitrary-file.jpeg">Text</a> 
<a href="http://domain.com/arbitrary-path/arbitrary-file.gif">Text</a> 
<a href="http://domain.com/arbitrary-file.png">Text</a> 

<a href="http://domain.com/arbitrary-file.html">Text</a> 
<a href="http://domain.com/arbitrary-path/">Text</a> 
<a href="http://domain.com/arbitrary-file#anchor_to_here">Text</a> 

Non-hyperlinked URL: http://domain.com/arbitrary-path/arbitrary-file.gif 
Non-hyperlinked URL: http://domain.com/arbitrary-file#anchor_to_here 

...應修訂爲。

+1

既然你標記這個「正則表達式」,你有沒有嘗試接近自己:

你可能有這樣的事情結束了?如果是這樣,你遇到了哪些問題? – bzlm 2010-03-04 19:29:59

+0

我認爲這可以最好地用正則表達式解決,但我真的很喜歡它。我希望用這個例子的正則表達式解決方案,我可以運行它並將解決方案應用於其他URL ......例如嵌入Flash視頻。 – Dolph 2010-03-04 19:35:54

回答

4

有這樣做沒有可靠方式,而不是至少使用正則表達式,但這仍然應該做的伎倆:

$str = preg_replace('~<a[^>]*?href="(.*?(gif|jpeg|jpg|png))".*?</a>~', '<img src="$1" />', $str); 

要打開這個了一下:

  • 查找開始<a標籤
  • 找到該標籤內的href屬性
  • 如果結束,請獲取href與列出的文件擴展名之一和"字符
  • 包含直至收盤</a>標籤鏈接的其餘部分替代
  • 與獲取HREF作爲src屬性的img元素替換整場比賽

正如鮑爾指出的那樣,使用DOM方法可能會更好。但是,如果您確定鏈接始終採用此格式,則可以使用正則表達式。正則表達式可能會更快一點。

+0

+1 - 謝謝!這也匹配'http:// domain.com/all-about-png',所以我最終使用'preg_replace('#()#e',''\"\"'「,$ str);'基於此現在回答,因爲原始的''正在(可靠地)由另一個系統生成......基於用戶提交的內容。 – Dolph 2010-03-04 20:20:05

7

您可能想看看如何使用HTML解析器(而不是正則表達式,因爲您標記提交),如PHP Simple HTML DOM Parser。這將爲您提供您所說的可靠性。

foreach($html->find('a') as $element) 
{ 
    echo '<img src="'.$element->href.'" alt="'.$element->innertext.'" />'; 
} 
+2

+1 - 輸入的答案几乎與此相同。確保在將它盲目地轉換爲圖像之前,測試正確的'href'屬性(即以.jpg,.gif等結尾)。或者,您也可以將選擇器更改爲find('a [href $ = jpg],[href $ = gif]')'。 – 2010-03-04 19:39:21

+0

+1 - 這可能是大多數人對這個問題的最佳答案,但我相信我正在使用的輸入鏈接足夠一致以避免這種額外的複雜性。感謝您的洞察力! – Dolph 2010-03-04 20:21:48

相關問題