Приглашаются все к участию в проекте «3000 статей для Википедии»

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

Материал из 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.

Инструменты
организаторы проекта
Компания ТрансТелеКом
Корпорация Intel
PH International
www.Iteach.ru
партнер проекта

Почта России

Классный Журнал


наши друзья



Жужа. Ежедневная сказка
мы поддерживаем

Образование



Установите «Letopisi NewsReader» на свой компьютер