正则表达式解析格式错误的无序列表

时间:2018-09-20 07:05:44

标签: html regex markup

我正在处理网站迁移。不幸的是,旧网站上的无序列表元素是在不使用ul标签的情况下进行格式化的。因此,我想将以下错误标记解析为常见的HTML ul标记:

<p class="bodytext">
	•&nbsp;&nbsp;&nbsp; This is some random text.<br>
	•&nbsp;&nbsp;&nbsp; This is some other random text.<br>
	•&nbsp;&nbsp;&nbsp; This is another random text.
</p>

重要事实:

  • 我们处于post元素的上下文中,因此有很多正文文本类
  • 最后一个列表元素没有br标签
  • 所有列表元素都具有“ bull”和3x“&nbsp”
  • 列表元素的数量是可变的

我考虑过一个正则表达式,但我不知道要解决上述问题,尤其是如何在不使用

的情况下“检测”要替换的位置以及如何匹配最后一个列表项

任何帮助都会得到赞赏。

2 个答案:

答案 0 :(得分:2)

如评论中所述,用正则表达式is a bad idea解析HTML。

如果您理解了这一点,但仍然想继续使用regexp,则可以执行以下操作:

1。插入<ul></ul>标签:

regexp:

(<p class="bodytext">)(.+?)(<\/p>)

替换为:

<ul>\2</ul>

给予

<ul>
    •&nbsp;&nbsp;&nbsp; This is some random text.<br>
    •&nbsp;&nbsp;&nbsp; This is some other random text.<br>
    •&nbsp;&nbsp;&nbsp; This is another random text.
</ul>

DEMO

2。插入<li></li>标签

正则表达式:

(•&nbsp;&nbsp;&nbsp; )(.+?)(<br>|)(\n)

替换为:

<li>\2</li>\n

礼物:

<ul>
    <li>This is some random text.</li>
    <li>This is some other random text.</li>
    <li>This is another random text.</li>
</ul>

DEMO

答案 1 :(得分:1)

您可以分两个步骤进行操作:

  1. 使用模式:<([^ ?]+).*>((?=[^<]*•&nbsp;&nbsp;&nbsp;)[\w\W]+)<\/(\1)>

<([^ ?]+).*><\/(\1)>确保您将拥有匹配的标签(打开和关闭),这要归功于对第一个捕获组\1的反向引用。

由于积极的前瞻性,它将仅匹配包含列表的元素: (?=[^<]*•&nbsp;&nbsp;&nbsp;)

Demo

在第二个捕获组中,您将拥有所有列表元素,因此可以将其替换为:<ul>\2</ul>。现在您将拥有类似的内容:

<ul>
  •&nbsp;&nbsp;&nbsp; This is some random text.<br>
  •&nbsp;&nbsp;&nbsp; This is some other random text.<br>
  •&nbsp;&nbsp;&nbsp; This is another random text.
</ul>
  1. 将所有出现的•&nbsp;&nbsp;&nbsp;替换为<li>