Korzystam sobie z funkcji preg_match_all do prostego parsowania strony WWW.

  1. <?php
  2. preg_match_all ('#<td class="tabdesc">([^<]+)</td>#', $kodstrony, $result); // linia 1
  3.  
  4. //preg_match_all ('#<td class="tabdata">([^<]+)</td>#', $kodstrony, $result2); // linia 2
  5. preg_match_all ('#<td class="tabdata">(.+)</td>#', $kodstrony, $result2); // linia 3
  6. ?>


Wszystko się ładnie wyświetla, poza jednym małym ale ...
Jeżeli korzystam z preg_match_all z linii 2 omijane są dane które zawierają np. inne znaczniki html (np <a>), co jest logiczne bo tak skontruowane jest wyrażenie regularne. Poprawiłem żeby zbierał wszystko co jest pomiędzy stringami interesującymi mnie - linia 3.
Niestety jest inny problem - w zbieranych danych jest ciąg "( r.)" - który zostaje pominięty przez to wyrażenie. Nie wiem dlaczego - kombinowałem na różne sposoby.

Pełna wersja wykorzystywanego przykładu:

CODE

function createPostString($aPostFields) {
foreach ($aPostFields as $key => $value) {
$aPostFields[$key] = urlencode($key) . '=' . urlencode($value);
}
return implode('&', $aPostFields);
}

function do_post_request($url, $data, $optional_headers = null)
{
$params = array('http' => array('method' => 'POST','content' => $data));
if ($optional_headers !== null)
{
$params['http']['header'] = $optional_headers;
}
$ctx = stream_context_create($params);
$fp = @fopen($url, 'rb', false, $ctx);
if (!$fp)
{
//throw new Exception("Problem with $url, $php_errormsg");
}
$response = @stream_get_contents($fp);
if ($response === false)
{
//throw new Exception("Problem reading data from $url, $php_errormsg");
}
return $response;
};

$postData = array();
$lista = array();

$lista[1] = 'ogolne';
$lista[2] = 'podstawowe';
$lista[3] = 'udzialowcy';
$lista[4] = 'kapital';
$lista[5] = 'raport_roczny';
$lista[6] = 'raport_kwartalny';
$lista[7] = 'list';

set_time_limit( 0 );
//foreach ($lista as $dane)
//{
$postData[ 'qtype' ] = 'ogolne';
$postData[ 'symbol' ] = '01NFI';
$kodstrony = do_post_request('http://dmbzwbk.bankier.pl/notoria/main.html', createPostString($postData));

preg_match_all ('#<td class="tabdesc">([^<]+)</td>#', $kodstrony, $result);

//preg_match_all ('#<td class="tabdata">([^<]+)</td>#', $kodstrony, $result2);
preg_match_all ('#<td class="tabdata">(.+)</td>#', $kodstrony, $result2);

$result_a = $result[0];
$result_b = $result2[0];

$count = count($result_a);
echo '<table>';
for ($i = 0; $i < $count; $i++)
{
echo '<tr><td>'.$result_a[$i].'</td>';
echo '<td>'.$result_b[$i].'</td></tr>';
}
echo '</table>';

?>