-1
4

2 回答 2

2

希望您尝试解析有效​​(至少足够有效)的 HTML 文档,您应该使用DOM它:

// 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); 
} 

注意使用loadHTMLnot load(它对错误更健壮)。您也可以设置DOMDocument::recover(如 hakre 评论中所建议的那样),以便解析器尝试从错误中恢复。

或者你可以使用xPath这里是语法的解释):

$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); 
    }
}

对于无效 HTML的情况,您可以像这样使用正则表达式:

$a1 = '\s*[^\'"=<>]+\s*=\s*"[^"]*"'; # Attribute with " - space tolerant
$a2 = "\s*[^'\"=<>]+\s*=\s*'[^']*'"; # Attribute with ' - space tolerant
$a3 = '\s*[^\'"=<>]+\s*=\s*[\w\d]*' # Unescaped values - space tolerant
# [^'"=<>]* # Junk - I'm not inserting this to regexp but you may have to

$a = "(?:$a1|$a2|$a2)*"; # Any number of arguments
$class = 'class=([\'"])pret\\1'; # Using ?: carefully is crucial for \\1 to work
                                 # otherwise you can use ["']
$reg = "<a{$a}\s*{$class}{$a}\s*>(.*?)</a";

然后只是preg_match_all所有的正则表达式都是从我的脑海中写出来的——你可能需要调试它们

于 2013-04-20T18:42:24.057 回答
0

得到这样的链接

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>..........)

所以我需要得到里面的第一个数字href和之间的数字span

于 2013-04-21T06:50:47.387 回答