Автор Тема: Регулярные. Паттерны хелп плиз.  (Прочитано 8031 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Covex

  • Только встал и уже устал.
  • Постоялец
  • ***
  • Сообщений: 208
  • +0/-0
  • 2
    • Просмотр профиля
Помогите люди. Замкнуло меня чего-то. Не могу решить как   резануть со страницы все, что находиться между body> и вывести на экран.
Файл открыт, потом его немного  implode, а далее что preg_match , eregi? Как будет выгдядеть шаблон?
Все мои попытки кончались лишь выводом первого слова после .
« Последнее редактирование: 24 Июня 2002, 00:04:46 от NAS »

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
Регулярные. Паттерны хелп плиз.
« Ответ #1 : 23 Июня 2002, 23:29:23 »
тут вобще-то можно и простые строковые функции использовать: 2 strpos() и один раз substr()

а если регекспы то примерно так:
preg_match("/(.*?)<\\/body>/im",$html_text, $matches);
print_r($matches);
(непроверял, но вроде правильно)
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Регулярные. Паттерны хелп плиз.
« Ответ #2 : 23 Июня 2002, 23:58:12 »
во-первых, не implode file, а fread
А во-вторых, если ты пробовал, то и надо приводить пример, что именно ты пробовал. Чтобы тебе объяснили твою ошибку. На будущее.

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
Регулярные. Паттерны хелп плиз.
« Ответ #3 : 24 Июня 2002, 00:11:12 »
Цитировать
во-первых, не implode file, а fread

$html_text = implode("",file("a.html"));
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Регулярные. Паттерны хелп плиз.
« Ответ #4 : 24 Июня 2002, 00:22:03 »
Правильно. Вот именно это делать не надо.
Очень глупо сначала считывать файл, бить его в массив, а потом снова джйнить из массива в одну строку.
То, что делается меньшим количеством операторов, далеко не всегда работает быстрее.

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
Регулярные. Паттерны хелп плиз.
« Ответ #5 : 24 Июня 2002, 00:30:11 »
Хммм. Честно говоря сам не тестил, но небезизвестный тебе Дима в http://php.spb.ru/php/speed.html#file писал что file() быстрее чем fopen/fread
Да и просто implode/file ИМХО УДОБНЕЕ чем fopen/fread
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Регулярные. Паттерны хелп плиз.
« Ответ #6 : 24 Июня 2002, 00:50:53 »
Видеть в книге надо не фигу, а то, что там написано.
У Димы ни слова не написано про fread и считывание файла в строку. Там речь идет о массиве.
А я и без тестирования знаю, что оно будет быстрее, чем file.
Ну, а про удобство я уже писал. Нормальных программистов вообще мало, а  уж в РНР, на котором каждая кухарка берется писать - и совсем кот наплакал.
А с кухарки - какой спрос. Кончено она будет делать "как удобнее", а не как оптимальнее.

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Регулярные. Паттерны хелп плиз.
« Ответ #7 : 24 Июня 2002, 00:59:21 »
Не поленился.
Протестировал.
$fd = fopen ($filename, "r");
$contents = fread ($fd, filesize ($filename));
fclose ($fd);
в 10 раз быстрее, чем
$contents=implode("",file($filename));
Файл 1 мег.

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
Регулярные. Паттерны хелп плиз.
« Ответ #8 : 24 Июня 2002, 02:08:31 »
Цитировать
Не поленился.
Протестировал.
$fd = fopen ($filename, "r");
$contents = fread ($fd, filesize ($filename));
fclose ($fd);
в 10 раз быстрее, чем
$contents=implode("",file($filename));
Файл 1 мег.

У меня под WIN98 PHP4.2.1 примеры:

<?php
error_reporting
(E_ALL);
include(
"Timer.php");
$filename="php4ts.dll";

$_preg = new Benchmark_Timer;
$_preg->start();
$fd fopen ($filename"r");
$contents fread ($fdfilesize ($filename));
fclose ($fd);
$_preg->stop();
echo 
$_preg->timeElapsed()."\\n";
?>

и

<?php
error_reporting
(E_ALL);
include(
"Timer.php");
$filename="php4ts.dll";

$_ereg = new Benchmark_Timer;
$_ereg->start();
$contents=implode("",file($filename));
$_ereg->stop();
echo 
$_ereg->timeElapsed();
?>

Показывают результаты на уровне 0.06 - 0.09 оба варианта
php4ts.dll - 1мег
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Регулярные. Паттерны хелп плиз.
« Ответ #9 : 24 Июня 2002, 03:35:56 »
Хех :-)
измеритель :-)
Во-первых, в php4ts.dll может вообще не быть переводов строк.
Во-вторых, делать надо в цикле.
а на таких малых цифрах погрешность очень велика.

Но класс городить ради 4 строчек - это круто...
У тебя небось накладные расходы на инициализацию таймерного класса забивают работу с файлом :-)))

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Регулярные. Паттерны хелп плиз.
« Ответ #10 : 24 Июня 2002, 04:14:15 »
На php4ts.dll на 200 итерациях у меня тоже большая разница получилась. 2,3с против 12.

Кстати, насчет удобства. Если тебе так жалко операторов, то можешь свою функцию сделать и считывать файл вообще одним. Если уж у тебя на замер времени целый класс пришпандорен, то для чтения файла тем более можешь расстараться :-)

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Регулярные. Паттерны хелп плиз.
« Ответ #11 : 24 Июня 2002, 04:19:54 »
Не, я правда по поводу таймерного класса не понимаю.
у меня весь замер времени занимает столько же символов, что у тебя - только вызов.
что там у тебя в классе такого понаписано-то, кроме
list($micro,$time)=explode(" ",microtime());
$stamp=$micro+$time;
list($micro,$time)=explode(" ",microtime());
echo ($micro+$time)-$stamp;
?
Не, я правда не понимаю...

Оффлайн Maniac

  • Ума нет - считай коллега
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 844
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Регулярные. Паттерны хелп плиз.
« Ответ #12 : 24 Июня 2002, 11:50:52 »
Ладно, ребята, не грызитесь. Проделал независимое испытание.


<?php
function getmicrotime(){
    list(
$usec$sec) = explode(" ",microtime());
    return ((float)
$usec + (float)$sec);
    }

$time_start getmicrotime();


for (
$i=0$i 100$i++)
{
$html_text implode("",file("access3.log"));
}

$time_end getmicrotime();
$time $time_end $time_start;

print 
"
Did implode 100 times in 
$time seconds";
$time_start getmicrotime();
for (
$i=0$i 100$i++)
{
$file=fopen("./access3.log","r");
$html_text fread($file,filesize("access3.log"));
fclose($file);
}

$time_end getmicrotime();
$time $time_end $time_start;
print 
"
Did fread 100 times in 
$time seconds";
?>


Результаты:
Did implode 100 times in 141.09852898121 seconds
Did fread 100 times in 3.3001800775528 seconds
TANSTAAFL

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
Регулярные. Паттерны хелп плиз.
« Ответ #13 : 24 Июня 2002, 13:01:40 »
Согласен, был неправ, вспылил. При размере текстового файла в 6 метров fread в 24 раза быстрее чем implode
Цитировать
$html_text = fread($file,filesize("access3.log"));
Насколько мне известно, данные функции filesize() кешируются php поэтому при следующих циклах данные браться будут из кеша. clearstatcashe() нужно делать (ИМХО) для более точного теста. Хотя даже в это млучае fread значительно быстрее на файлах большого размера.

Цитировать
Кстати, насчет удобства. Если тебе так жалко операторов, то можешь свою функцию сделать и считывать файл вообще одним.
Тоже мне нашел к чему придраться.
Удобно мне так и код более читабельный получается.
И класс уже готовый, самому писать ничего не нужно было.
Может ты еще скажешь, что и классы нельзя использовать?
Ведь они почти в 1.5 раза замедляют работу скриптов
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Регулярные. Паттерны хелп плиз.
« Ответ #14 : 24 Июня 2002, 13:20:04 »
Значешь, я не буду говорить, что нельзя. Используй на здоровье :-)
Просто когда я хочу поесть супу, я беру ложку, а не экскаватор :-)

А дело действительно не в clearstatcache, а в накладных расходах на работу с массивами.

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28