使用RegExp-PHP从标记中提取文本
我试图从网页的源代码中提取一些字符串,如下所示:使用RegExp-PHP从标记中提取文本,php,regex,html-parsing,Php,Regex,Html Parsing,我试图从网页的源代码中提取一些字符串,如下所示: <p class="someclass"> String1<br /> String2<br /> String3<br /> </p> String1 String2 String3 我敢肯定,只有这些字符串以一个换行符()结尾。其他一切都以两个或多个换行符结束。我试着用这个: preg_match_all('~(.*?)<br />{1}~', $source,
<p class="someclass">
String1<br />
String2<br />
String3<br />
</p>
String1
String2
String3
我敢肯定,只有这些字符串以一个换行符()结尾。其他一切都以两个或多个换行符结束。我试着用这个:
preg_match_all('~(.*?)<br />{1}~', $source, $matches);
preg_match_all('~(.*)
{1}',$source,$matches);
但它不像预期的那样工作。它还会返回一些其他文本以及这些字符串。尝试以下操作:
preg_match_all('~^(.*?)<br />$~m', $source, $matches);
preg\u match\u all(“~^(.*?”
$~m',$source,$matches);
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;
}
$html=textContent;
}
我不建议使用正则表达式来获取值。相反,请使用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类的更多信息:
下面是一个演示:(单击“运行”)应该可以。请试一试
preg_match_all("/([^<>]*?)<br\s*\/?>/", $source, $matches);
preg_match_all(“/([^]*?)/”,$source,$matches);
或者,如果字符串可能包含一些HTML代码,请使用以下代码:
preg_match_all("/(.*?)<br\s*\/?>\\n/", $source, $matches);
preg\u match\u all(“/(.*?\\n/”,$source,$matches);
@杰克:没有。真是一团糟。我只想要琴弦。它返回的信息要多得多。不要使用正则表达式来解析HTML。您无法用正则表达式可靠地解析HTML,在这条路上您将面临悲伤和挫折。一旦HTML改变了您的预期,您的代码就会被破坏。有关如何使用已经编写、测试和调试过的PHP模块正确解析HTML的示例,请参阅。不确定为什么它仍然被否决,它应该在有限的范围内按预期工作。