【问题标题】:Extract Text from within tags using RegExp PHP使用 RegExp PHP 从标签中提取文本
【发布时间】:2013-06-18 13:22:51
【问题描述】:

我正在尝试从网页的源代码中提取一些字符串,如下所示:

<p class="someclass">
String1<br />
String2<br />
String3<br />
</p>

我很确定这些字符串是唯一以单个换行符结尾的东西(
)。其他所有内容都以两个或多个换行符结束。我试过用这个:

preg_match_all('~(.*?)<br />{1}~', $source, $matches);

但它并没有像预期的那样工作。它还会返回一些其他文本以及这些字符串。

【问题讨论】:

  • @Jack:不。这是一团糟。我只想要字符串。它返回更多。
  • 不要使用正则表达式解析 HTML。您无法使用正则表达式可靠地解析 HTML,并且您将面临悲伤和挫败感。一旦 HTML 与您的期望发生变化,您的代码就会被破坏。有关如何使用已编写、测试和调试的 PHP 模块正确解析 HTML 的示例,请参阅 htmlparsing.com/php

标签: php regex html-parsing


【解决方案1】:

DOMDocument 和 XPath 助你一臂之力。

$html = <<<EOM
<p class="someclass">
String1<br />
String2<br />
String3<br />
</p>
EOM;

$doc = new DOMDocument;
$doc->loadHTML($html);
$xp = new DOMXPath($doc);

foreach ($xp->query('//p[contains(concat(" ", @class, " "), " someclass ")]') as $node) {
    echo $node->textContent;
}

Demo

【讨论】:

    【解决方案2】:

    我不建议使用正则表达式来获取值。相反,使用 PHP 的内置 HTML 解析器,如下所示:

    $dom = new DOMDocument();
    $dom->loadHTML($source);
    $xpath = new DOMXPath($dom);
    
    $elements = $xpath->query('//p[@class="someclass"]');
    $text = array(); // to hold the strings
    if (!is_null($elements)) {
        foreach ($elements as $element) {
            $text[] = strip_tags($element->nodeValue);
        }
    }
    print_r($text); // print out all the strings
    

    这是经过测试和工作的。您可以在此处阅读有关 PHP 的 DOMDocument 类的更多信息:http://www.php.net/manual/en/book.dom.php

    这是一个演示:http://phpfiddle.org/lite/code/0nv-hd6(点击“运行”)

    【讨论】:

      【解决方案3】:

      试试这个:

      preg_match_all('~^(.*?)<br />$~m', $source, $matches);
      

      【讨论】:

      • 不知道为什么它仍然被否决,它应该在其有限的范围内按预期工作。
      【解决方案4】:

      应该可以。请尝试一下

      preg_match_all("/([^<>]*?)<br\s*\/?>/", $source, $matches);
      

      或者如果您的字符串可能包含一些 HTML 代码,请使用以下代码:

      preg_match_all("/(.*?)<br\s*\/?>\\n/", $source, $matches);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-09
        • 2010-12-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-01
        • 1970-01-01
        • 2021-05-05
        相关资源
        最近更新 更多