【问题标题】:Regular Expression to replace <p> tags with line breaks用换行符替换 <p> 标记的正则表达式
【发布时间】:2010-04-17 20:09:41
【问题描述】:

我有以下 HTML

<p>Some text <a title="link" href="http://link.com/" target="_blank">my link</a> more 
text <a title="link" href="http://link.com/" target="_blank">more link</a>.</p>
<p>Another paragraph.</p>
<p>[code:cf]</p>
<p>&lt;cfset ArrFruits = ["Orange", "Apple", "Peach", "Blueberry", </p>
<p>"Blackberry", "Strawberry", "Grape", "Mango", </p>
<p>"Clementine", "Cherry", "Plum", "Guava", </p>
<p>"Cranberry"]&gt;</p>
<p>[/code]</p>
<p>Another line</p>
<p><img src="http://image.jpg" alt="Array" />
</p>
<p>More text</p>
<p>[code:cf]</p>
<p>&lt;table border="1"&gt;</p>
<p> &lt;cfoutput&gt;</p>
<p> &lt;cfloop array="#GroupsOf(ArrFruits, 5)#" index="arrFruitsIX"&gt;</p>
<p>  &lt;tr&gt;</p>
<p> &lt;cfloop array="#arrFruitsIX#" index="arrFruit"&gt;</p>
<p>     &lt;td&gt;#arrFruit#&lt;/td&gt;</p>
<p> &lt;/cfloop&gt;</p>
<p>  &lt;/tr&gt;</p>
<p> &lt;/cfloop&gt;</p>
<p> &lt;/cfoutput&gt;</p>
<p>&lt;/table&gt;</p>
<p>[/code]</p>
<p>With an output that looks like:</p>
<p><img src="another_image.jpg" alt="" width="342" height="85" /></p>

我正在尝试做的是编写一个正则表达式,它将删除所有&lt;p&gt;&lt;/p&gt;,并且每当找到&lt;/p&gt; 时,它将用换行符替换它。

到目前为止,我的模式如下所示:

/\<p\>(.*?)(<\/p>)/g

我将匹配替换为:

$1\n

一切看起来都不错,但它也替换了 [code][/code] 标签内的内容,在这种情况下,它根本不应该替换 &lt;p&gt; 标签,因此,我想摆脱 @ 987654330@ 标签,当[code] 标签内的内容时。

我永远无法正确否定,我知道它会类似于

\<p\>^\[code*\](.*?)(<\/p>)

但显然这不起作用:-)

谁能帮我解决这个正则表达式?

顺便说一句,我知道我根本不应该使用正则表达式来解析 HTML。我完全意识到这一点,但对于这种特定情况,我还是想使用正则表达式。

提前致谢

【问题讨论】:

  • 您使用的是什么正则表达式风格? Javascript?爪哇? 。网?珀尔?蟒蛇?
  • "但是,对于这种特殊情况,我还是想使用正则表达式。" ...但是,我还是想骑自行车去南极洲。

标签: java regex html-parsing


【解决方案1】:

我假设您对生成您尝试解析的 HTML 的应用程序有特殊的了解,否则 you would not be even considering regular expressions for the task。 (部分原因是,我认为&lt;p&gt; 标签总是出现在换行符之后,而&lt;/p&gt; 结束标签总是出现在换行符之前。)

上面已经说过,您无法轻松或有效地仅使用正则表达式来实现您想要实现的目标(您必须使用复杂的嵌套后瞻和前瞻断言来验证您的 &lt;p&gt;...&lt;/p&gt; 出现是不在[code]...[/code] 块内,并且非固定长度的后视断言特别有限,并且在 JDK1.6 之前的 IIRC 普通错误。)

您应该首先迭代输入序列,将其分解为code 和非code 块,然后将块转移到输出序列中,或者保持不变(在code 块的情况下)或使用@ 987654329@-substitution 通过正则表达式或简单的字符串替换应用(在非code 块的情况下。)

是否必须(或如何)处理嵌套或不匹配的code 块由您决定。

【讨论】:

    【解决方案2】:

    我知道我不应该使用常规 表达式来解析 HTML。我是 充分意识到这一点,但仍然,因为 这个具体案例,我想用 正则表达式。

    你能再解释一下吗?

    【讨论】:

    • “我知道我不应该用螺丝刀敲钉子,但这一次,我想用螺丝刀。”说不!
    【解决方案3】:

    否定前瞻的语法是(?!)

    (?![code.*?]([^\[]|\[\/[^c]|\[\/c[^o]|\[\/co[^d]|\[\/cod[^e]|\[\/code[^\]])*)&lt;p&gt;.*?&lt;/p&gt;

    【讨论】:

    • 这只会让我的代码块的第一行带有

      标签,其他所有内容都没有,并且仅适用于页面上的一个代码块

    猜你喜欢
    • 1970-01-01
    • 2013-05-29
    • 2012-10-28
    • 2014-03-10
    • 2012-09-12
    • 2016-11-12
    • 1970-01-01
    • 2013-01-10
    • 1970-01-01
    相关资源
    最近更新 更多