2010-03-04 61 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

相关问题