我试图从网页的源代码中提取一些字符串,如下所示:
<p class="someclass">
String1<br />
String2<br />
String3<br />
</p>
我很确定这些字符串是唯一以单行换行结束的内容(
)。其他所有内容都以两个或多个换行符结束。我试过用这个:
preg_match_all('~(.*?)<br />{1}~', $source, $matches);
但它不会像它应该的那样工作。它还返回一些其他文本以及这些字符串。
答案 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;
}
答案 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);