【问题标题】:Constructing a regular expression to wrap images with <a>构造正则表达式以用 <a> 包装图像
【发布时间】:2010-04-22 07:09:23
【问题描述】:

一个网页包含很多图片元素:

<img src="myImage.gif" width="180" height="18" />

但它们的格式可能不是很好,例如,可能缺少宽度或高度属性。它也可能无法用 / 正确关闭。 src 属性始终存在。

我需要一个正则表达式,用一个将 href 设置为 img 的 src 的超链接包装这些内容。

<a href="myImage.gif" target="_blank"><img src="myImage.gif" width="180" height="18" /></a>

我可以在此编辑器中使用此正则表达式成功定位图像:http://gskinner.com/RegExr/:

<img src="([^<]*)"[^<]*>

但是下一步是什么?

【问题讨论】:

  • 您在寻找哪种语言?
  • 只是好奇,不应该是...[^&gt;]*&gt;吗?
  • @polygenelubricants 将 [^] 或 [^] 应该没问题,因为这两个字符无论如何都不应该出现在这些地方。
  • @rtpHarry 不是任何一种特定的语言,我只是不知道如何引用那些捕获的组,但我想我现在知道了。谢谢。
  • 只是指出,我不知道你是否意识到这一点,但不同的语言有不同的正则表达式实现,如 POSIX、.net、javascript 都有变化

标签: html regex


【解决方案1】:

基于 DOM 的方法是最好的,但如果该正则表达式有效(对于一般的 HTML 输入来说不容易完成)以匹配所需的 &lt;img&gt; 元素和 src 的值在\1 中捕获的属性,然后将整个匹配项(在\0 中捕获)替换为:

<a href="\1" target="_blank">\0</a>

在 Java 中,替换字符串中的反向引用将是 $0$1;我不确定您使用的是什么语言,因此请相应调整。

但是,在 Java 中,这样的事情会起作用:

String imgHrefed = str.replaceAll(
   "<img src=\"([^<]*)\"[^<]*>",
   "<a href=\"$1\" target=\"_blank\">$0</a>"
);

从您的问题中不清楚如何处理&lt;img&gt; 可能具有的任何其他属性。上述替换使它们保持原样。如果您还想重写它们(即您不再只是&lt;img&gt; 包装在&lt;a&gt; 中),那么也许您想重写为:

<a href="\1" target="_blank"><img src="\1" width="180" height="18" /></a>

【讨论】:

  • 所有答案都非常相似,因为这个得到了最多的选票,我跟随大多数人认为这是最好的。
【解决方案2】:

在 JavaScript 中,使用 string.replace()$1 是您匹配的部分:

str.replace(/<img src="([^<]*)"[^<]*>/, 
    '"<a href="$1" target="_blank"><img src="$1" width="180" height="18" /></a>')

或者最好还是捕获整个image 标记(现在src 是$2,因为它在第二次捕获中):

s.replace(/(<img src="([^<]*)"[^<]*>)/, '"<a href="$2" target="_blank">$1</a>')

【讨论】:

  • 我没有使用 javascript,但这应该是一个有用的。谢谢。
【解决方案3】:

在 .net 中,正则表达式在大多数情况下与 javascript 基本相同,但周围代码的符号会略有不同。

    string imageHtmlSnippet = @"<img src=""myImage.gif"" width=""180"" height=""18"" />";
    string imageHtmlReplacement = @"<a href=""$1"" target=""_blank""><img src=""$1"" width=""180"" height=""18"" /></a>";

    Regex findImages = new Regex(@"<img src=""([^<]*)""[^<]*>");

    string fixedHtmlSnippet = findImages.Replace(imageHtmlSnippet, imageHtmlReplacement);

但是 - 如果 src 不是标签上的第一个属性,则此正则表达式将失败。我没有时间修复它,因为我应该已经出门了:)

实际上,您应该寻找一个 html 解析库,例如 HtmlAgilityPack 来解析它(如果您在 .net 中工作):

【讨论】:

  • 我没有使用任何特定的语言工作。我只是在使用该编辑器并尝试在 html 文档中使用超链接包装图像。但是当我在 .NET 中工作时,您的代码 sn-ps 应该很有用。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-26
  • 2014-04-23
  • 1970-01-01
  • 2016-03-03
  • 1970-01-01
  • 2017-02-11
  • 1970-01-01
相关资源
最近更新 更多