Php 呼应<;a>;有class=";pret";来自html文档
我有一个phpPhp 呼应<;a>;有class=";pret";来自html文档,php,regex,Php,Regex,我有一个php$content格式的html文档。我可以回显它,但我只需要所有的 我尝试了更多来自www的示例,但我要么得到空数组,要么得到php错误 一个regex示例为我提供了一个空数组(表中有标记) 各种错误的原因:未验证的html、非utf 8字符 接下来,我在另一个网站上做了这项工作,匹配了单个SQL表中的内容,结果是复制了一个网站,其中包含来自我国的更新数据。我将不再在www上搜索匹配的单个结果。希望您尝试解析有效(至少足够有效)的HTML文档,您应该使用: // Simple ex
$content
格式的html文档。我可以回显它,但我只需要所有的
我尝试了更多来自www的示例,但我要么得到空数组,要么得到php错误
一个regex示例为我提供了一个空数组(表中有
标记)
各种错误的原因:未验证的html、非utf 8字符
接下来,我在另一个网站上做了这项工作,匹配了单个SQL表中的内容,结果是复制了一个网站,其中包含来自我国的更新数据。我将不再在www上搜索匹配的单个结果。希望您尝试解析有效(至少足够有效)的HTML文档,您应该使用:
// Simple example from php manual from comments
$xml = new DOMDocument();
$xml->loadHTMLFile($url);
$links = array();
foreach($xml->getElementsByTagName('a') as $link) {
$links[] = array('url' => $link->getAttribute('href'),
'text' => $link->nodeValue);
}
注意使用not(它只是对错误更具鲁棒性)。您还可以设置(正如hakre在注释中所建议的),以便解析器尝试从错误中恢复
或者您可以使用():
对于无效HTML的情况,您可以像这样使用regexp:
$a1='\s*[^\'”=]+\s*=\s*“[^”]*';#具有“-空间容差”的属性
$a2=“\s*[^'\”=]+\s*=\s*'[^']*'”;#具有“-空间容差”的属性
$a3='\s*[^\'“=]+\s*=\s*[\w\d]*'#未转换的值-允许空间
#[^'”=]*#垃圾-我不会将此插入regexp,但您可能必须这样做
$a=“(?:$a1 |$a2 |$a2)*”;#任意数量的参数
$class='class=([\'”])pret\\1';#Using?:仔细使用对\\1的工作至关重要
#否则,您可以使用[“']
$reg=“(.*?)获得了如下链接
preg_match_all('/<a[^>]*class="pret">(.*?)<\\/a>/si', $content, $links);
print_r($links[0]);
preg_match_all('/...)
因此,我需要获取href
中的第一个数字以及span
之间的数字,为什么不使用dom解析器而不是一个复杂的regexp?您的(任意)regexp将来很可能会崩溃。您应该使用来完成它。我确实尝试过dom,但导致了错误,因此我认为我使用regex得到的空数组更接近结果,我们可以问一下您得到了什么错误吗?500内部服务器错误尝试了类似的操作,相同的错误消息,因此可能是文档不是有效的HTML……。painafter使用w3验证,很抱歉!无法检查此文档。非utf 8字符…因此,删除非utf 8字符可能会有所帮助?如果没有非utf 8字符,html 5验证程序会说托盘结束标记头。;看到正文开始标记,但相同类型的元素已打开。。在上次错误后无法恢复。任何进一步的错误都将被忽略。-还有e错误可以被抑制,只需在这个网站上搜索现有的问答。我们已经涵盖了所有这些案例。
// Simple example from php manual from comments
$xml = new DOMDocument();
$xml->loadHTMLFile($url);
$links = array();
foreach($xml->getElementsByTagName('a') as $link) {
$links[] = array('url' => $link->getAttribute('href'),
'text' => $link->nodeValue);
}
$xpath = new DOMXpath($doc);
$elements = $xpath->query("//a[@class='pret']");
if (!is_null($elements)) {
foreach ($elements as $element) {
$links[] = array('url' => $link->getAttribute('href'),
'text' => $link->nodeValue);
}
}
preg_match_all('/<a[^>]*class="pret">(.*?)<\\/a>/si', $content, $links);
print_r($links[0]);
Array(
[0] => <a href='/word_word_34670_word_number.htm' class="pret"><span>3340.3570 word</span></a>..........)