Знаете-ли-что? скрипт

Материал из Letopisi.Ru — «Время вернуться домой»
Перейти к: навигация, поиск

Текст скрипта для чтения новостей Летописи

 <?php

header('content-type: application/x-javascript; charset=windows-1251');

function utf8win1251($s){
  $out=""; $c1=""; $byte2=false;
  for ($c=0;$c<strlen($s);$c++){
    $i=ord($s[$c]); if ($i<=127) $out.=$s[$c];
    if ($byte2) { $new_c2=($c1&3)*64+($i&63); $new_c1=($c1>>2)&5;
      $new_i=$new_c1*256+$new_c2;
      if ($new_i==1025) $out_i=168; else
      if ($new_i==1105) $out_i=184; else $out_i=$new_i-848;
      $out.=chr($out_i); $byte2=false; }
    if (($i>>5)==6) {$c1=$i;$byte2=true; } }
 return $out; }

 
$src = file_get_contents("http://letopisi.ru/index.php/%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%97%D0%BD%D0%B0%D0%B5%D1%82%D0%B5_%D0%BB%D0%B8_%D0%B2%D1%8B");

 $tmp = preg_replace('/.*<ul><li>(.*)<\/ul>.*<div class="printfooter">.*/s', '$1', $src);
 $tmp = trim(preg_replace('/href="/', 'href="http://letopisi.ru', $tmp));
 $matches = explode('</li>', $tmp);

 if (sizeof($matches) > 1) {
   $trans = Array("\x0D" => "", "\x0A" => " ");
   do { 
     $quote = trim($matches[rand(0, sizeof($matches)-2)]); 
   } while (empty($quote));
   $quote = str_replace('<li>', '', utf8win1251(strtr($quote, $trans)));
   $quote = preg_replace('/<div class="thumb.*<\/div>/', '', $quote);
   $quote = str_replace('"', '\"', $quote);
   print 'document.write("' . $quote . '");';
 }

 ?>

Внимание!

Регулярные выражения, использующиеся, в частности, и в PHP, по умолчанию 'жадные' (greedy). То есть, например, фрагмент '.*' захватит максимально возможное число символов, при котором еще можно выполнить остальные требования выражения. В результате в данном случае будет выводиться не случайный, а всегда последний элемент списка. Чтобы 'вылечить от жадности' регулярное выражение достаточно поставить после 'звездочки' вопросительный знак. В данном случае следует поменять строчку

$tmp = preg_replace('/.*<ul><li>(.*)<\/ul>.*<div class="printfooter">.*/s', '$1', $src);

на

$tmp = preg_replace('/.*?<ul><li>(.*)<\/ul>.*?<div class="printfooter">.*/s', '$1', $src);

Нужно заметить, что про описанную особенность работы регулярных выражений почему-то забывают даже авторы серьезных и подробных книг по PHP.

Персональные инструменты
Инструменты