【发布时间】: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,没错,我真的不想解析它我只想选择除
<img[^>]+>之外的所有文本,这只是文本选择而已。
标签: html regex select text image