1

我正在使用正则表达式从网站中提取数据,但现在我发现了一个问题。

这是我要解析的原始 HTML 的一部分。我想提取“descuentos-”之后的文本和“<a href>”之后的城市。

<div id="cities2_2">
  <a href = "http://website.com/descuentos-espana/">Badajoz</a>
  <a href = "http://website.com/descuentos-espana/">Badalona</a>
  <a href = "http://website.com/descuentos-barcelona/">Barcelona</a>
  <a href = "http://website.com/descuentos-bilbao/">Bilbao</a>
  <a href = "http://website.com/descuentos-espana/">Burgos</a>
</div>
</div>
<div class="capa_cities" onmouseover="act_formato(3, 2);"
     onmouseout="desact_formato(3, 2);">
<h2 id="title_city3_2">C</h2>
<div id="cities3_2">
  <a href = "http://website.com/descuentos-espana/">Cáceres</a>
  <a href = "http://website.com/descuentos-cadiz/">Cádiz</a>
  <a href = "http://website.com/descuentos-espana/">Cartagena</a>
  <a href = "http://website.com/descuentos-espana/">Castellón</a>
  <a href = "http://website.com/descuentos-espana/">Ceuta</a>
  <a href = "http://website.com/descuentos-espana/">Ciudad Real</a>
  <a href = "http://website.com/descuentos-cordoba/">Córdoba</a>
  <a href = "http://website.com/descuentos-espana/">Cuenca</a>

我可以寻找 <a href = " http://website.com/descuentos- (.*)">,但还有其他与网站中的模式相匹配的。所以我现在有这个模式:

#<div id="cities[0-9]+_2">(<a href = "http://website.com/descuentos-(.*?)/">(.*?)</a>)*#

我想让它递归。我的意思是:对于找到的每个“<a href =” http://website.com/descuentos- (.* )/">(.*)</a>",搜索里面的两个小图案。

有没有办法在正则表达式中实现这一点,或者我必须通过 preg_match_all 重新处理它?

4

1 回答 1

2

选项 1:快速方法:是的,使用 preg_match_all()

preg_match_all('#<a href = "http://website.com/descuentos-(.*?)/">.*?</a>#', $str, $matches);

echo "<pre>";
print_r($matches);
echo "</pre>";

返回:

Array
(
    [0] => Array
        (
            [0] => Badajoz
            [1] => Badalona
            [2] => Barcelona
            [3] => Bilbao
            [4] => Burgos
            [5] => Cáceres
            [6] => Cádiz
            [7] => Cartagena
            [8] => Castellón
            [9] => Ceuta
            [10] => Ciudad Real
            [11] => Córdoba
            [12] => Cuenca
        )

    [1] => Array
        (
            [0] => espana
            [1] => espana
            [2] => barcelona
            [3] => bilbao
            [4] => espana
            [5] => espana
            [6] => cadiz
            [7] => espana
            [8] => espana
            [9] => espana
            [10] => espana
            [11] => cordoba
            [12] => espana
        )

    [2] => Array
        (
            [0] => Badajoz
            [1] => Badalona
            [2] => Barcelona
            [3] => Bilbao
            [4] => Burgos
            [5] => Cáceres
            [6] => Cádiz
            [7] => Cartagena
            [8] => Castellón
            [9] => Ceuta
            [10] => Ciudad Real
            [11] => Córdoba
            [12] => Cuenca
        )

)

Time elapsed: 0.000104904174805 

选项 2: DOM Parser : ($str 是你的文本);

$dom = new DomDocument();
$dom->loadHTML($str);

$links = $dom->getElementsByTagName('a');

foreach($links as $link){
    $href = $link->getAttribute('href');

    echo $href." ### ";//prints the href
    preg_match('#descuentos-(.*)/#', $href, $match);
    echo $link->nodeValue." - ".$match[1]."<br/>";
}

输出(添加 utf-8 标头以查看正确的字符):

http://website.com/descuentos-espana/ ### Badajoz - espana
http://website.com/descuentos-espana/ ### Badalona - espana
http://website.com/descuentos-barcelona/ ### Barcelona - barcelona
http://website.com/descuentos-bilbao/ ### Bilbao - bilbao
http://website.com/descuentos-espana/ ### Burgos - espana
http://website.com/descuentos-espana/ ### Cáceres - espana
http://website.com/descuentos-cadiz/ ### Cádiz - cadiz
http://website.com/descuentos-espana/ ### Cartagena - espana
http://website.com/descuentos-espana/ ### Castellón - espana
http://website.com/descuentos-espana/ ### Ceuta - espana
http://website.com/descuentos-espana/ ### Ciudad Real - espana
http://website.com/descuentos-cordoba/ ### Córdoba - cordoba
http://website.com/descuentos-espana/ ### Cuenca - espana
Time elapsed: 0.000319004058838 
于 2013-09-24T09:38:51.780 回答