使用RegEx PHP从标记内提取文本

时间:2013-06-18 13:22:52

标签: php regex html-parsing

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

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

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

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

但它不会像它应该的那样工作。它还返回一些其他文本以及这些字符串。

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分: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(点击“运行”)

答案 2 :(得分:-1)

试试这个:

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

答案 3 :(得分:-1)

应该有效。请试一试

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

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

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