我有一些HTML文件(大约500个),这些文件来自某个编辑器,它有时没有在某些段落周围放置<p>
标记。相反,它似乎使用了换行符作为段落指示符。
问题是我正在处理的HTML文件混合了HTML和这种奇怪的使用换行符作为段落的标记。
我计划用PHP运行一个脚本,一次打开一个HTML文件,并扫描它,以查找换行之间的字符串,以及它们周围没有HTML标记的字符串。
我想我需要使用lookaround,但我的尝试并不成功。
假设字符串为:
<p>hello</p>
hi, world
<p>hello
world</p>
hi
, world
<p>hello <b>world</b></p>
hello</p>
<p>world
我想我想要从上面的示例中得到的是两个“hi,world”字符串。
我想我需要的正则表达式是:一行的开头,后面不是HTML开头标签,后面是许多字符,后面不是HTML结尾标签,后面是一行的结尾。
下面是我目前为止的正则表达式:
^(?!<.*?>).*?(?!</.*?>)$
不幸的是,该正则表达式还捕获了以结束HTML标记结尾的字符串(但没有开始HTML标记)。
我如何用正则表达式解决这个问题?我的正则表达式怎么了?
另外,PHP中有没有更好的解决方案来清理HTML?
1条答案
按热度按时间jv4diomz1#
使用
DOMDocument
而不是正则表达式来解析它,因为正则表达式太难读,容易出错。要只获取文本节点,运行一个XPATH查询,并将原始dom中的每个文本节点替换为一个新创建的具有文本节点值的
p
元素。最后,保存HTML,您就可以开始了。注意,如果之前没有DOCTYPE和html标签,这也会添加适当的DOCTYPE和html标签,我想这对您来说不是问题。程式码片段: