【问题标题】:Preg_match_all how to correctly get all info?Preg_match_all 如何正确获取所有信息?
【发布时间】:2015-11-05 10:04:38
【问题描述】:

无法理解如何正确地从网络获取所有信息,不仅仅是一行,而是全部。

此脚本产生输出:Array Array Array Array and only one row.

<table id="rounded-corner" width=100%>
    <tr>
      <td>Nuotrauka</td>
      <td>Pavadinimas</td>
      <td>miestas</td>
      <td>metai</td>
      <td>kaina</td>
    </tr>
  <?
  $url = "My Link";
  $contents = file_get_contents($url);

  preg_match_all("|<span class=\"ttitle2\">(.*?) </span>|U",$contents,$pavadinimas);
  preg_match_all("|<span class=\"ttitle3\">(.*?)</span>|U",$contents,$miestas);
  preg_match_all("|<span class=\"ttitle1\">(.*?)</span>|U",$contents,$metai);
  preg_match_all("|<span class=\"ttitle1\" style='float: left;'>(.*?)<br />|U",$contents,$kaina);
  preg_match_all("/<img .*?(?=src)src=\"([^\"]+)\"/si", $contents, $img_link); 

  $output = "<tr><td><img src=$img_link></td><td>$pavadinimas</td><td>$miestas</td><td>$metai</td><td>$kaina</td></tr>";

  print_r($output);


 ?>
</table>

【问题讨论】:

  • 你能分享 $contents html 来检查一下吗?
  • 请查看已发布的答案。希望它能解决你的问题。
  • 卢卡斯您好,请使用我发布的答案。我认为它可以解决您的问题。

标签: php arrays web-scraping preg-match-all


【解决方案1】:

试试这个。它正在根据需要提取数据。

    <table style="border: 1px solid black;" id="rounded-corner" width=100%>
    <tr>
      <td style="border: 1px solid black;">Nuotrauka</td>
      <td style="border: 1px solid black;">Pavadinimas</td>
      <td style="border: 1px solid black;">miestas</td>
      <td style="border: 1px solid black;">metai</td>
      <td style="border: 1px solid black;">kaina</td>
    </tr>
<?php
  $url = "put_your_url";
  $contents = file_get_contents($url); 

  preg_match_all('/<span class="ttitle2".*?>(.*?)<\/span>/',$contents,$pavadinimas); 

  preg_match_all('/<span class="ttitle3".*?>(.*?)<\/span>/',$contents,$miestas); 

  preg_match_all('/<span class="ttitle1".*?>(.*?)<\/span>/',$contents,$metai_kaina); 

  foreach($metai_kaina[0] as $key=>$metai_kaina_val){ 
    if($key%2==0)
    $metai[] = strip_tags($metai_kaina_val);
    else  
    $kaina[] = strip_tags($metai_kaina_val);  
  }

  preg_match_all('/<img .*?(?=src)src=\"([^\"]+)\"/si', $contents, $img_link);

  for($i=0; $i<count($pavadinimas[0]); $i++){
    echo '<tr>
          <td style="border: 1px solid black;"><img src="'.$img_link[1][$i+2].'"></td>
          <td style="border: 1px solid black;">'.$pavadinimas[0][$i].'</td>
          <td style="border: 1px solid black;">'.$miestas[0][$i].'</td>
          <td style="border: 1px solid black;">'.$metai[$i].'</td>
          <td style="border: 1px solid black;">'.$kaina[$i].'</td>
        </tr>';
    }
?>
</table>

【讨论】:

  • 卢卡斯,所有的值都在数组中。现在你只需要融入你的外表。
  • ok..我会帮你使用的。可以与我分享一个模型或屏幕热以哪种方式显示值?
  • 卢卡斯,我已经更新了帖子。只需复制并替换为您的并放置网址。通过使用它,您可以在 html 表格中显示提取的数据。
【解决方案2】:

函数的$matches 参数将始终是一个数组 - 您需要在将变量添加到输出字符串之前对其进行处理。

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

据我所知,您不能 print_r 混合使用字符串和数组。

【讨论】:

  • 首先看看你得到的匹配 - 正如@Igor Savinkin 指出的那样:print_r($pavadinimas); print_r($miestas); ...
【解决方案3】:

如果所有匹配返回相同数量的结果,这似乎由 $output 结构暗示,迭代其中一个:

$output = '';
foreach ($pavadinimas[1] as $index => $match) { 
    $output .= '<tr><td><img src=' . $img_link[1][$index] . '></td><td>' . $match . '</td><td>' . $miestas[1][$index] . '</td><td>' . $metai[1][$index] . '</td><td>' . $kaina[1][$index] . '</td></tr>';    
}

【讨论】:

    【解决方案4】:

    preg_match_all 进行深度复杂的搜索。最大它将是二维数组。阅读docs

    如何正确获取所有信息?

    为此,您只需转储所有结果信息:

    print_r($pavadinimas);
    print_r($miestas);
    ...
    

    但我需要将所有信息放在表格中

    多一点创造力;如果$pavadinimas 是二维数组:

    echo '<table>';
    foreach($p in $pavadinimas){
        echo '<tr>'; 
        foreach($item in $p){
             echo '<td>' ,  $item , '</td>' ;
        } 
        echo '</tr>';   
    }
    echo '</table>';
    

    注意

    要反转二维数组顺序,您只需在 preg_match_all 中使用标志(PREG_PATTERN_ORDERPREG_SET_ORDER)(参见 flag 文档中的部分)。因此,您将拥有其他订单的桌子。

    【讨论】:

      猜你喜欢
      • 2018-10-17
      • 1970-01-01
      • 2012-07-02
      • 1970-01-01
      • 1970-01-01
      • 2015-02-02
      • 1970-01-01
      • 1970-01-01
      • 2019-07-13
      相关资源
      最近更新 更多