Оптимизируем работу с регулярными выражениями. 2 простые функции.
Главным оружием любого профессионального парсера являются регулярные выражение (особенно перловые PCRE). И я, если честно, вообще не представляю как без них можно делать просто и быстро свою работу.
Одним словом просто прелесть. И эту прелесть мы каждый день используем.
Сечас я приведу 2 классических варианта использования регулярных выражений:
if (preg_match("/$price_find/Ui",$content,$m)) { unset($m[0]); $price=mysql_escape_string(trim($m[1])); } else { $price=''; } if (preg_match_all("/$blocks_find/Ui",$content,$m)) { unset($m[0]); $blocks=$m[1]; } else { $blocks=array(); }
На первый взгляд довольно таки простой код. Ни отнять, ни прибавить. А теперь представьте, что вам надо искать по 100 параметров на странице. И тогда этот код начнет непомерно расти и станет для вас настоящим наказанием. В подобных случаях я использую две небольшие функции, которые действительно упрощают мне жизнь и уменьшают время, затрачиваемое на разработку:
function pregm($what, $where, $return=1, $keys='Ui') { $search="/$what/$keys"; if (preg_match($search,$where,$matches)) { unset($matches[0]); if ($return==1) { return $matches[1]; } else { return $matches; } } else { return false; } } function pregma($what, $where, $return=1, $keys='Ui') { $search="/$what/$keys"; if (preg_match_all($search,$where,$matches)) { unset($matches[0]); if ($return==1) { return $matches[1]; } else { return $matches; } } else { return false; } }
Благодаря этим функциям весь начальный код можно преобразовать к следующему виду:
$price=mysql_escape_string(trim(pregm($price_find,$content)); $blocks=pregma($blocks_find,$content);
Вот так все просто. Мы сократили объем кода в несколько раз и сделали его более прозрачным и простым.
Конечно же если регулярные выражения вы используете два раза в год, то прибегать к данной библиотеке нет смысла, но если регулярки - ваша повседневная работа, то вам надо максимально использовать вышеупомянутый код и даже развить его под свои нужны. Так я, например, в случаях, когда надо найти большое количество параметров, использую массивы. Вот пример:
$param=array( 'Название', 'Цена', 'Размер', 'Автор' //... ); $find=array(); // Получаем контент и делаем прочие преобразования foreach ($param as $key=>$item) { $find_it=$item."\:(.*)$"; $find[$key]=strip_tags(pregm($find_it,$block)); }
Получится, что в массиве $find у нас будут все найденные параметры. Потом можно просто сделать implode("','",$find), добавить пару кавычек и практически целиком залить эту строку в базу. Получается очень быстро и удобно.
Суть этой заметки. Регулярные выражения - мощный инструмент, а свои надстройки над ними - еще более мощный и удобный инструмент!

[YS.PRO]:
Пора переходить на ООП. Легче библиотеку будет расширять, да и лаконичнее выглядеть будет.
2 Декабрь 2007, 7:41 ппadmin:
:)))))))))))))))))))))))))))))
У меня все только на основе ООП и сделано. Но это маленькая библиотечка и ее совершенно не надо реализовывать в виде класса, потому как это заставит таскать за собой экземпляр объекта да и вообще не особо прикольно.
Короче не стоит оно того.
2 Декабрь 2007, 10:07 пп[YS.PRO]:
Другое дело, что маленькая )…
2 Декабрь 2007, 10:21 ппadmin:
Я думаю, что для небольших таких библиотечек надо использовать именно функциональный подход и не использовать ООП, потому что так будет на порядок легче :))
7 Декабрь 2007, 11:54 пп