使用PHP显示表中的数据(从网站检索)

时间:2017-03-22 17:04:54

标签: php regex preg-match-all

我想用PHP从this site检索数据并显示它。

我使用PHP中的pregmatch函数在3个不同的表中检索了所需的值(来自文章名称,价格以及下面的其他值)。还剩下的是,将它们显示在具有两个维度的表格中。

该表应在第一行中包含文章名称和价格。其余行应包含标题后跟其值。

这是我目前的PHP代码:

<?php

$debut="https://www.agriconomie.com";
$txt = file_get_contents('https://www.agriconomie.com/pieces-agricoles/tracteur/attelage---relevage/pc2902');    /*ici c'est pour Lire la page html*/

$results = array();
// $test = preg_match_all('#<a href="(.*?)">#', $txt, $names_array);

$test = preg_match_all('#<a href="(.+)" class="(.+)" title="(.+)"#', $txt, $names_array);

/*recupéré les liens du site  en particuliers le text qui se situe entre griffe "" du href*/

for($i = 0; $i < count($names_array[1]); $i++) 
{
    $j=$i;

    $debut="https://www.agriconomie.com".$names_array[1][$i]; 

    $adresse =$debut;
    /* echo $adresse ; ?>    <br /> <?php */

    $page = file_get_contents ($adresse);

    /* preg_match_all ('#<h3 class="product-name">(.+)</h3>#', $page, $names_array5); */                       
    preg_match_all ('#(<dd>(.+)</dd>)#', $page, $names_array2); 
    preg_match_all ('#<span><i class="icon-chevron-right"></i>(.*?)</span>#', $page, $names_array3); 
    preg_match_all ('#<p class="price" itemprop="price" content="(.*?)">#', $page, $names_array4);

    echo "<center>";

    echo "<table class='table table-bordered table-striped table-condensed'>";

    /*
    for($j = 0; $j < count($names_array5[1]); $j++)  
    {
        $NOM   =  $names_array5[1][$j]; 

        echo  'Nom ='.$NOM ; 
    }   
    */ 

    for($j = 0; $j < count($names_array4[1]); $j++)  
    {
        $price   =  $names_array4[1][$j]; 
        echo     'Prix ='.$price.'$' ; 
    } 


    for($i = 0; $i < count($names_array3[1]); $i++) 
    {
        for($j= 0; $j < count($names_array2[1]); $j++){
            $descriptif   =  $names_array2[1][$i];   
        }

        $intitule   =  $names_array3[1][$i]; 
        echo "<tr><td>".$intitule." </td>  <td> ".$descriptif." </td> </tr> ";
    } 
}

echo "</table>";
echo "</center>";

?>

1 个答案:

答案 0 :(得分:0)

我找到了许多要纠正/整理的东西,所以我几乎完全重写了。

$debut="https://www.agriconomie.com";
$txt = file_get_contents('https://www.agriconomie.com/pieces-agricoles/tracteur/attelage---relevage/pc2902');

if(!preg_match_all('#<a href="([^"]*?)".*?title="([^"]*?)"#',$txt,$desarticles)){exit("Failure @ desarticles");}
foreach($desarticles[1] as $i=>$url_ext){
    $page=file_get_contents("https://www.agriconomie.com{$url_ext}");  // https://www.agriconomie.com/clips-ordinaire-de-9x45-le-cent/p207990

    if(!preg_match_all('#<p class="price" itemprop="price" content="(.*?)">#',$page,$desprix)){exit("Failure @ desprix ($i)");}
    if(!preg_match_all('#<i class="icon-chevron-right"><\/i>(.*?)<\/span>.*?<dd>(.+)<\/dd>#s',$page,$information)){exit("Failure @ information ($i)");}

    echo "<center>";
        echo "<table class='table table-bordered table-striped table-condensed'>";
            echo "<tr>";
                echo "<td>{$desarticles[2][$i]}</td>";  // borrow $i from iteration of $desarticles[1]
                echo "<td>Prix ={$desprix[1][0]}$</td>";  // Price (only one per loop)
            echo "</tr>";
            foreach($information[1] as $k=>$info){
                echo "<tr>";
                    echo "<td>{$info}</td>";
                    echo "<td>{$information[2][$k]}</td>";  // borrow $k from iteration of $information[1]
                echo "</tr>";
            }
        echo "</table>";
    echo "</center>";
}

一些更好的观点:

  • 我在$ desarticle上加速了正则表达式,省略了中间捕获组。
  • 我删除了一些不必要的变量。
  • 我用foreach循环替换了循环的迭代/计数(以避免计数条件)。
  • 我将两个preg_match_all行合并为一个名为$ information。
  • 我在$ information上的正则表达式中转义了结束标记。
  • 我根据要求创建了一个干净的基本双列表结构。