HTML中的文本与PHP Regex函数匹配

时间:2011-02-19 08:55:38

标签: php regex preg-match

  

可能重复:
  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>&nbsp;&nbsp;&nbsp; Text text text text text
text text
    </DL><P>
    <P><B>2 - Title 2</B>
    <P>
    <DL><DD>&nbsp;&nbsp;&nbsp; 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>&nbsp;&nbsp;&nbsp;

和下一个HTML标记(&lt;)作为文本,并以某种方式将两者保持在一起以进行进一步处理。知道如何用PHP的Regexp函数做到这一点吗?

1 个答案:

答案 0 :(得分:1)

正如您对问题的评论所表明的那样,Stack Overflow上经常会出现同样问题,而正确的答案通常是“不要尝试用正则表达式解析HTML”。然而,除了提出这一点之外,我认为在答案中举一个例子来展示如何采用建议的方法是有用的。对于你问题中的情况,可以这样做:

<?php

$html = <<<EOF
    <P><B>1- TITLE</B>
    <P>
    <DL><DD>&nbsp;&nbsp;&nbsp; Text text text text text
text text
    </DL><P>
    <P><B>2 - Title 2</B>
    <P>
    <DL><DD>&nbsp;&nbsp;&nbsp; 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和子项是否是您所期望的名称的标记,但无论如何都显示了这个想法。