PHP正则表达式:查找未 Package 在HTML标记中的字符串行

bq9c1y66  于 2022-10-30  发布在  PHP
关注(0)|答案(1)|浏览(105)

我有一些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?

jv4diomz

jv4diomz1#

使用DOMDocument而不是正则表达式来解析它,因为正则表达式太难读,容易出错。
要只获取文本节点,运行一个XPATH查询,并将原始dom中的每个文本节点替换为一个新创建的具有文本节点值的p元素。最后,保存HTML,您就可以开始了。注意,如果之前没有DOCTYPE和html标签,这也会添加适当的DOCTYPE和html标签,我想这对您来说不是问题。

程式码片段:

<?php

$doc = new DOMDocument();
libxml_use_internal_errors(true); // you can capture errors and do the exception handling here if the HTML is malformed. Using this for the sake of demonstration here.
$doc->loadHTMLFile('test.html');

$xpath = new DOMXPath($doc);
$textnodes = $xpath->query('/html/body/text()');

foreach($textnodes as $node){
  $pTag = $doc->createElement('p', $node->nodeValue);
  $node->parentNode->replaceChild($pTag, $node);
}

$doc->saveHTMLFile('test.html');

相关问题