alhames.ru
Дано:
Имеется произвольный набор текста, размером не превышающим 100 Кб.
Задача:
Необходимо извлечь из текста все имэйлы и создать двумерный массив вида:
Вопрос:
Какие методы в данном случае будут наиболее оптимальны?
Имеется произвольный набор текста, размером не превышающим 100 Кб.
Задача:
Необходимо извлечь из текста все имэйлы и создать двумерный массив вида:
Вопрос:
Какие методы в данном случае будут наиболее оптимальны?
function get_emails($s)
{
preg_match_all("#([\w][-\.\w]+)\@([-\.\w]+\.[a-z]{2,5})#i", $s, $m, PREG_PATTERN_ORDER);
return array("login" => $m[1], "domain" => $m[2]);
}
?>
?
1. какая предполагается нагрузка на скрипт (количество итераций в еденицу времени, максимальный объем текста за одну итерацию)
2. Версия php и apache
Единственное, что надо учесть - это то, что большинство хостингов еще не поддерживают PHP 5, поэтому желательно ограничется ресурсами 4й версии.
La personne mystique я попробую протестировать скорость исполнения регулярки -завтра напишу.
А если использовать строковые функции -какой алгоритм?
регулярные выражения - 1.42 сек
строковые функции - 1.67 сек
вот так использовал строковые функции (правда, тут есть ложные срабатывания
function get_emails($s)
{
$offset = 0;
$len = strlen($s);
$data = array();
while (($pos = strpos($s, '@', $offset)) !== FALSE)
{
$l = 1;
while (($p = $pos - $l) >= 0 && (ctype_alnum($c = $s[$p]) || $c == '-' || $c == '_' || $c == '.'))
++$l;
--$l;
$r = 1;
while (($p = $pos + $r) <= $len && (ctype_alnum($c = $s[$p]) || $c == '-' || $c == '_' || $c == '.'))
++$r;
--$r;
if ($s[$pos + $r] == ".") --$r;
$data[] = array("username" => substr($s, $pos - $l, $l), "domain" => substr($s, $pos + 1, $r));
$offset = $pos + $r;
}
return $data;
}
?>
PS: Замеры по времени подтверждают описанные результаты.
Например, при работе с обычной html страничкой, с 20-30 адресами, регулярка дает 35-40 итераций в секунду, а строковые функции (реализация практически такая же как и у La personne mystique) - 2900-3100 итераций.
Имеется ввиду полный код html-странички? Мне собственно его обрабатывать и надо..
Да, кстать, а как ты измеряешь это кол-во итераций? А то мне это понятие непривычно -я привык в секундах все мерить..
UPD: на каждой итерации - echo ++$iterations;
Ладно, сейчас буду разбираться..
Кстати, хотел спросить, а что если написать скрипт автоматической генерации (и дегенерации
FVA интересная методика =) Только если функция выполняется больше секунды она не особо продуктивой становится - куда детальней в секундах будет
Мне нравицо =)
А тему SEO добавлю