【问题标题】:regex: selecting everything but img tag正则表达式:选择除 img 标签之外的所有内容
【发布时间】:2011-05-20 12:14:21
【问题描述】:

我正在尝试使用正则表达式选择一些文本,使所有 img 标记保持不变。

我发现以下代码选择了所有img 标签:

/<img[^>]+>/g

但实际上有这样的文字:

This is an untagged text.
<p>this is my paragraph text</p>
<img src="http://example.com/image.png" alt=""/>
<a href="http://example.com/">this is a link</a>

使用上面的代码会选择img标签only

/<img[^>]+>/g #--> using this code will result in:
<img src="http://example.com/image.png" alt=""/>

但我想使用一些正则表达式来选择除图像之外的所有内容:

/magical regex/g # --> results in:
This is an untagged text.
<p>this is my paragraph text</p>
<a href="http://example.com/">this is a link</a>

我也找到了这段代码:

/<(?!img)[^>]+>/g

选择除img 之外的所有tags。但在某些情况下,我会有未标记的文本或标签之间的文本,所以这不适用于我的情况。 :(

有什么办法吗? 抱歉,但我对正则表达式真的很陌生,所以我真的努力了几天试图让它工作,但我做不到。

提前致谢


更新:

好吧,对于那些认为我想解析它的人,对不起,我不想要它,我只想选择文本。

另一件事,我没有使用任何特定的语言,我使用的是Yahoo Pipes,它只提供正则表达式和一些字符串工具来完成这项工作。但它不会演化任何编程代码。

为了更好地理解这里是正则表达式模块在雅虎管道中的工作方式:

http://pipes.yahoo.com/pipes/docs?doc=operators#Regex


更新 2

幸运的是,我能够按照@Blixt 的建议逐步删除img 标签附近的文本,例如:

<(?!img)[^>]+> , replace with "" #-> strips out every tag that is not img
(?s)^[^<]*(.*), replace with $1  #-> removes all the text before the img tag
(?s)^([^>]+>).*, replace with $1 #-> removed all the text after the img tag

这样做的问题是它只会捕获第一个 img 标签,然后我必须手动执行它并捕获其他硬编码它,所以我仍然不确定这是否是最佳解决方案。

【问题讨论】:

  • 你使用什么语言,Javascript,PHP?
  • @David:天哪,我讨厌这个网站上不断出现的 HTML 反正则表达式。你不能用正则表达式解析 HTML,但是这样的任务可以很简单地完成。他没有解析它。
  • 我看不出这个用例有什么更好的地方。HTML 不规则,那么为什么要坚持使用错误的工具来完成这项工作呢?它躲避我。
  • 感谢@Orbling,没错,我真的不想解析它我只想选择除&lt;img[^&gt;]+&gt;之外的所有文本,这只是文本选择而已。

标签: html regex select text image


【解决方案1】:

你必须找到图像标签的正则表达式可以与替换一起使用以获得你想要的。

假设您使用的是 PHP:

$htmlWithoutIMG = preg_replace('/<img[^>]+>/g', '', $html);

如果您使用的是 Javascript:

var htmlWithoutIMG = html.replace(/<img[^>]+>/g, '');

这会获取您的文本,找到&lt;img&gt; 标签并将它们替换为空,即。它会从文本中删除它们,留下你想要的。不记得&lt;,&gt; 是否需要转义。

【讨论】:

  • 感谢@Orbling,对不起,如果我表达自己的方式错误,我认为我需要选择所有文本,期待img标签中的那个,因为我想做你的事'已经提到,用空字符串替换所有非“img”文本,这将只剩下图像。在这种情况下,我的目标是图像而不是文本本身 :) 谢谢
  • 所以你想要所有的图像,而不是文本,这与此相反吗?这将返回没有图像的文本,这听起来就像你在说的那样。
  • @ludicco 您需要打开全局匹配g 选项,我的两个示例都已启用,请参阅:stackoverflow.com/questions/360492/…
【解决方案2】:

正则表达式匹配只有一个开始和长度。这意味着您想要的结果在单场比赛中是不可能的(因为您希望结果在某一点结束,然后再继续)。

最接近的方法是使用正则表达式匹配从字符串开头到&lt;img&gt; 标记开头的所有内容、&lt;img&gt; 标记之间的所有内容以及从&lt;img&gt; 标记结尾到字符串结尾的所有内容。然后您可以从该正则表达式中获取所有匹配项(在您的示例中,将有两个匹配项)。

以上答案是假设您无法修改结果。如果您可以修改结果,只需将&lt;img&gt; 标记替换为空字符串即可得到您的结果。

【讨论】:

  • 全局匹配怎么样? preg_match_all() 在 perl 等中
  • 没错。不过,我不知道这是否适用于他。
  • 非常感谢@Blixt,他们使用了类似perl的正则表达式,这里有一些例子pipes.yahoo.com/pipes/docs?doc=operators#Regex
  • 这对我来说很有意义,刚刚用教育部的详细信息更新了我的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-05
  • 1970-01-01
  • 1970-01-01
  • 2017-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多