可能重复:
Preg match text in php between html tags
RegEx match open tags except XHTML self-contained tags
我有以下列方式格式化的大量文本:
<P><B>1- TITLE</B>
<P>
<DL><DD> Text text text text text
text text
</DL><P>
<P><B>2 - Title 2</B>
<P>
<DL><DD> Text text text text text
text text Text text text text text
text text Text text text text text
text text
<br><I>Additional irrelevant information</I>
</DL><P>
我正在尝试使用PHP的Regexp函数来检索Title-Text值对,同时删除多余的字符以及一些文本块后面的无关信息。我最好是:
抓住<P><B> and </B>
作为标题
抓取
之间的所有文字<DL><DD>
和下一个HTML标记(&lt;)作为文本,并以某种方式将两者保持在一起以进行进一步处理。知道如何用PHP的Regexp函数做到这一点吗?
答案 0 :(得分:1)
正如您对问题的评论所表明的那样,Stack Overflow上经常会出现同样问题,而正确的答案通常是“不要尝试用正则表达式解析HTML”。然而,除了提出这一点之外,我认为在答案中举一个例子来展示如何采用建议的方法是有用的。对于你问题中的情况,可以这样做:
<?php
$html = <<<EOF
<P><B>1- TITLE</B>
<P>
<DL><DD> Text text text text text
text text
</DL><P>
<P><B>2 - Title 2</B>
<P>
<DL><DD> Text text text text text
text text Text text text text text
text text Text text text text text
text text
<br><I>Additional irrelevant information</I>
</DL><P>
EOF;
$d = new DomDocument;
$d->loadHtml($html);
$xp = new DomXpath($d);
$matches = $xp->query("//p/b", $d);
foreach ($matches as $dn) {
echo "Title is: " . $dn->nodeValue . "\n";
$dl = $dn->parentNode->nextSibling->nextSibling->firstChild;
$dd = $dl->firstChild;
echo "Content is: " . $dd->nodeValue . "\n";
}
?>
根据您需要的强大程度,您可能希望检查nextSibling
和子项是否是您所期望的名称的标记,但无论如何都显示了这个想法。