0

我有一个看起来像这样的字符串:

<p class="thumbnail"><img src="/media/2905/260x150.gif" alt="260x150"
                          width="260" height="150" rel="260,150" /></p>

变量是图像、src、alt 标签、宽度等。它们都可以改变。

我正在尝试编写一个正则表达式,该正则表达式将匹配是否存在<p/>带有缩略图的 css 类和子节点的标签<img/>,如果是,则将字符串替换为:

<p><img class="thumbnail" src="/media/2905/260x150.gif" alt="260x150"
        width="260" height="150" rel="260,150" /></p>

我很简单,对正则表达式感到绝望!任何人都可以提供任何指示,甚至是解决方案吗?

4

3 回答 3

1

尝试使用HTML Agility Pack解析 HTML,然后在找到匹配项时重新排列属性。正如我在您的问题下的评论中所写的那样,如果您打算处理任何类型的现实世界的 HTML,那么您将没有机会使用正则表达式来执行此操作。浏览器容忍损坏的 HTML(缺少结束标签)、无效标签等,正则表达式会阻塞。

于 2013-06-10T14:45:05.333 回答
0

尽管强烈建议您不要使用 Regex来匹配 HTML,但如果您使用的 HTML 非常一致,我将给您一个可以工作的方法。这是一个Rubular来证明以下结果。

此正则表达式<p><img.+class.+?\"thumbnail\".+?<\/p>将匹配下面的第一个和第三个字符串:

<p><img class="thumbnail" src="/media/2905/260x150.gif" alt="260x150" width="260"
        height="150" rel="260,150" /></p>
<p><img class="test" src="/media/2905/260x150.gif" alt="260x150" width="260"
        height="150" rel="260,150" /></p>
<p><img class = "thumbnail" src="/media/2905/260x150.gif" alt="260x150"
        width="260" height="150" rel="260,150" /></p>

让我澄清一下社区对 Regex 和 HTML 的立场。HTML 的问题在于它的定义不是正则的,因此它的定义本身就违背了正则表达式。考虑以下 HTML:

<img src="some source"></img>
<img src="some source" />

这两行都是完全有效的,并且会被浏览器正确呈现,但是正如您所看到的,这两行的正则表达式将完全不同。

于 2013-06-10T14:42:40.837 回答
-1

简短的回答是你不能。长答案在Bartdude 的评论中。有关其背后的理论,请参阅此 SO 问题:

为什么不能使用正则表达式来解析 HTML/XML:通俗易懂的正式解释

您可以尝试一些在非常特定范围内起作用的东西。但是如果你沿着这条路走,你的项目发展得越多,解决方案的成本就越高(浪费精力),直到你最终碰壁并且无法通过它。

在没有看到其余代码的情况下,我唯一的建议是尽可能制作这些图像和其他标签服务器控件。这样,您可以将它们作为 C# 代码中的变量,并且可以将 OOP 逻辑应用于您的标签。不理想,但更接近正确的解决方案。

于 2013-06-10T14:43:04.683 回答