2011-02-08 42 views
1

我试图使用两个preg_match以从html源代码中获取两个特定值。两个连续的preg_match

<?php 

    $url = "http://www.example.com"; 
    $userAgent="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1"; 
    $ch = curl_init(); 
    curl_setopt($ch,CURLOPT_USERAGENT,$userAgent); 
    curl_setopt($ch,CURLOPT_URL,$url); 
    curl_setopt($ch,CURLOPT_AUTOREFERER,true); 
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,true); 
    curl_setopt($ch,CURLOPT_TIMEOUT,10000000); 
    $html = curl_exec($ch); 
    preg_match('~<span class="first">(.*)<\/span>~msU',$html,$matching_data); 
    preg_match('~<span class="second">(.*)<\/span>~msU',$html,$matching_data2); 
    print_r($matching_data); 
    print_r($matching_data2); 
?> 

在这方面采取的$html VAR包含以下顺序考虑:

<title>foobar title</title> 
<body> 
<div class="second">Not this one</span> 
<div> 
<span class="first">First</span> 
<span class="second">this one<span> 
</div> 
</body> 

如果我跑我php代码,第一print_r返回正确的价值:<span class="first">First</span>。但第二个print_r,而不是返回<span class="second">this one<span>它返回<div class="second">Not this one</span>

所以我想preg_match函数开始治疗的开始,而不是最后preg_match调用。

如何让第二个(第三,第四等)呼叫preg_match在最后一次呼叫时运行?

谢谢,

问候。

+0

你可以使用preg_match_all。 – igorw 2011-02-08 13:05:58

回答

3

要连续拨打preg_match,继续搜索结果从哪里来,请使用PREG_OFFSET_CAPTURE标志:

http://php.net/manual/en/function.preg-match.php

至于较大的问题,正则表达式通常不适合解析HTML。您应该使用某种DOM解析器为您完成这项工作,这就是如果您甚至需要在服务器端完成这项工作。这种事情可以在客户端使用JavaScript非常简单(自然而然地)完成 - 您只需将相关值传回给服务器即可。

0

可以使用偏移捕获,并在的preg_match功能失调参数(php:preg_match

int preg_match (string $pattern, string $subject [, array &$matches[, int $flags [, int $offset]]])

试试这个:

<?php 

... 

preg_match('~<span class="first">(.*)<\/span>~msU',$html,$matching_data,PREG_OFFSET_CAPTURE); 
preg_match('~<span class="second">(.*)<\/span>~msU',$html,$matching_data2,PREG_OFFSET_CAPTURE, $matching_data[0][1]+strlen($matching_data[0][0])); 
print_r($matching_data); 
print_r($matching_data2); 
0

这是您需要使用的HTML代码吗?这不是有效的HTML。您可以使用preg_match_all为@igorw建议:

preg_match_all('~<(span|div) class="(first|second)">(.*)<\/?span>~msU', $html,$matching_data); 
echo '<xmp>'; print_r($matching_data[0]); 

但是,如果HTML是有效的:

<title>foobar title</title> 
<body> 
<span class="second">Not this one</span> 
<div> 
<span class="first">First</span> 
<span class="second">this one</span> 
</div> 
</body> 

preg_match_all('~<span class="(first|second)">(.*)<\/span>~msU', $html, $matching_data); 
echo '<xmp>'; print_r($matching_data[0]);