正则表达式:选择除img标签之外的所有内容

时间:2010-12-05 12:06:03

标签: html regex select text image

我正在尝试使用正则表达式选择一些文本,使所有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标签

/<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

选择除tags之外的所有img。但在某些情况下,我会在标签之间添加无标记的文字或文字,因此这对我的情况不起作用。 :(

有什么办法吗? 对不起,但我对正则表达式真的很陌生,所以我真的很努力地试图让它运作几天,但我不能。

提前致谢


更新

好吧,对于那些想要解析它的人,抱歉我不想要它,我只是想选择文字。

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

为了更好地理解这里是regex模块在yahoo管道中工作的方式:

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


更新2

幸运的是,我能够删除img标签附近的文字,但是按照@Blixt推荐的那样逐步删除,例如:

<(?!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标签,然后我必须手动执行并抓住其他硬编码,所以我仍然不确定这是否是最佳解决方案。

2 个答案:

答案 0 :(得分:1)

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

假设您使用的是PHP:

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

如果您使用的是Javascript:

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

这将获取您的文本,找到<img>标记并将其替换为空,即。它会从文本中删除它们,留下你想要的东西。无法回想起<,>是否需要转义。

答案 1 :(得分:0)

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

你可以得到的最接近的是使用一个正则表达式,它匹配从字符串开始到<img>标记开头的所有内容,<img>标记之间的所有内容以及<img>结尾的所有内容标记到字符串的结尾。然后你可以从正则表达式获得所有匹配(在你的例子中,将有两个匹配)。

以上答案假设您无法修改结果。如果您可以修改结果,只需将<img>标签替换为空字符串即可获得结果。