Preg_match_all如何正确获取所有信息?

Can't understand how correctly get all info from web, not just one row but all.

This script produces the output : 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>

Try this. It is extracting data as required.

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

preg_match_all makes deep complex search. Maximum it'll be two dimentional array. Read docs

how to correctly get all info?

For this to find out you just dump out all the result info:

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

but i need that all info put in table

Be little more inventive; if $pavadinimas is 2d array:

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

Note

To invert the 2d array order you just use flag (PREG_PATTERN_ORDER or PREG_SET_ORDER) in the preg_match_all (see flag section in docs). Thus you will have your table with other order.

The $matches parameter of the function will always be an array - you need to process the variable before adding them to the output string.

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

As far as I'm aware you can't print_r a mixture of string and array.

If all matchings return the same number of results, which seems to be implied by your $output structure, iterate over one of them:

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