使用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的示例,请参阅。不确定为什么它仍然被否决,它应该在有限的范围内按预期工作。