Правильный парсер html

Как вы делаете парсер (скрипт, который выдёргивает некую информацию с некой страницы)? Вставляете кучу strpos, preg_match и прочее "прицеливание"?

Предлагаю вашему вниманию абсолютно другой способ:  Simple HTML DOM Parser - скрипт, который позволяет работать с DOM документа, а конекретнее, использовать css-селекторы для поиска нужных элементов.

Маленький пример:

  1. <?php
  2. // загружаем библиотеку
  3. require './simplehtmldom/simple_html_dom.php';
  4.  
  5. // будем парсить гугл :)
  6. $d = file_get_html ( 'http://www.google.com/search?hl=en&q=%D1%8B%D1%80%D0%BE%D0%BB%D0%B2%D0%B0&aq=f&oq=&aqi=' );
  7.  
  8. // селектор результатов
  9. foreach($d->find('li.g') as $snippet) {
  10. $r = array();
  11. $r['link'] = $snippet->find( 'h3.r a', 0 )->href; // ссылка
  12. $r['title'] = $snippet->find( 'h3.r', 0 )->plaintext; // заголовок
  13. // убираем лишнее
  14. $snippet->find( 'div.s cite', 0 )->innertext = '';
  15. $snippet->find( 'div.s span', 0 )->innertext = '';
  16. $r['snippet'] = $snippet->find( 'div.s', 0 )->plaintext; // сниппет
  17. $rez[] = $r;
  18. }
  19.  
  20. // показываем..
  21. print_r( $rez );

Вот так легко и элегантно можно парсить сниппеты гугла :) Кстати, библиотеку лучше качать из транка svn - там версия выше + мануал обширнее.

Как выполнять функции прямо в heredoc и double-quoted строках

Многие сталкивались с этой проблемой.. надеюсь мой способ поможет кому-то кроме меня выполнять функции, выражения и многое другое прямо в heredoc или строке в двойных кавычках. Иногда очень полезная штуковина :)

  1. <?php
  2. // Функция-хак
  3. $__eval = create_function( '$c', 'return $c' );
  4.  
  5. // Проверяем..
  6. define( 'constant_str', 'smth string' );
  7. define( 'constant_int', 8 );
  8.  
  9. $x = 6;
  10. $y = 2;
  11.  
  12. function z( $x, $y ) { return $x * $y; }
  13.  
  14. // Примеры использования
  15. // Синтаксис: {$__eval( [expressions|variables|constants|functions|object->methods|etc] )}
  16. echo "1st: {$__eval(4+5)} text\r"; // выводит '1st: 9 text'
  17. echo "2nd: {$__eval(constant_str)} and text\r"; // выводит '2nd: smth string and text'
  18.  
  19. echo <<<HEREDOC
  20. 3rd: {$__eval( z($x, $y) + constant_int / 2)} and text again
  21. HEREDOC;
  22. // выводит '3rd: 20 and text again'

Чем залить большие большие дампы mysql на сервер - BigDump

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

Можно делить дамп на несколько меньших запросов, но это довольно муторно - представьте, поделить гигабайтовый дамп на 100 или больше файлов - с ума сойдёшь.. Можно, конечно, залить дамп и через консоль, но далеко не все хостеры предоставляют эту возможность.

Поэтому, необходим скрипт, который сам делил бы большой дамп на несколько частей и частями его заливал. Такой скрипт есть :) называется он BigDump. Очень прост в использовании: заливаете скрипт, в ту же папку дамп, прописываете в скрипте данные для соединения с mysql и всё, считайте дело сделано :)

Проверял на дампах больше 1 ГБ, работает как часы. Один нюанс - иногда приходится также настроить размеры запросов, на которые делит скрипт дамп.. но это не проблема.

Расширенный file_get_contents или про cURL можно забыть

Меня всегда озадачивал вопрос - почему все так и норовят везде и всюду использовать cURL, восхваляя его? Почему просто не использовать встроенные функции вместо сторонней библиотеки, которая, к тому же, ещё и установлена не у всех? Итак, открываем завесу тьмы и развеиваем бытующее мнение о "несамостоятельности" php..

В php существует замечательная вещь - контекст потоков. Эти контексты содержат в себе наверно весь функционал cURL (список врапперов/протоколов с описаниями) - ещё ни одна задача не заставила меня использовать cURL.

Чтобы не остаться голословным, маленький пример реализации POST запроса из мануала на встроенных функциях:

  1. <?php
  2.  
  3. $postdata = http_build_query(
  4. array(
  5. 'var1' => 'some content',
  6. 'var2' => 'doh'
  7. )
  8. );
  9.  
  10. $opts = array('http' =>
  11. array(
  12. 'method' => 'POST',
  13. 'header' => 'Content-type: application/x-www-form-urlencoded',
  14. 'content' => $postdata
  15. )
  16. );
  17.  
  18. $context = stream_context_create($opts);
  19.  
  20. $result = file_get_contents('http://example.com/submit.php', false, $context);