Регулярные выражения и ресурсы сервера.

bmn

Новичок
Регулярные выражения и ресурсы сервера.

Добрый день!

Скрипт очень сильно жрёт ресурсы. Мне кажется, что дело в регулярных выражениях (поправьте, если я не прав).
Скрипт получает input-поля и значения аргументов.
выглядит примерно так:
PHP:
$string_tpl = "[a-zA-ZА-Яа-яЁё0-9\!\@\#\$\%\^&\*\(\)\+\=\-\<\?\/\.,;:\[\]\{\}_]";
$string_tpl_1 = "[a-zA-ZА-Яа-яЁё0-9\!\@\#\$\%\^&\*\(\)\+\=\-\<\>\?\/\.,;:\'\[\]\{\}_ ]";
$string_tpl_2 = "[a-zA-ZА-Яа-яЁё0-9\!\@\#\$\%\^&\*\(\)\+\=\-\<\>\?\/\.,;\":\[\]\{\}_ ]";

// находим все input-поля
preg_match_all ("!<input([^>]*)>!is", $forms[2][$k], $inputs);
$inputs = $inputs[1];

while (list ($ik, $iv) = each ($inputs))
{
// получаем значения аргументов (перебираем все возможные способы их задания)
    preg_match_all ("/(\w+)\s?=\s?(".$string_tpl."*)/", $iv, $matches);
    preg_match_all ("/(\w+)\s?=\s?\"(".$string_tpl_1."*)\"/", $iv, $matches_1);
    preg_match_all ("/(\w+)\s?=\s?\'(".$string_tpl_2."*)\'/", $iv, $matches_2);
// может быть эти три способа можно в одном выражении рассмотреть?!

    $keys = array_merge ($matches[1], $matches_1[1], $matches_2[1]);
    $vals = array_merge ($matches[2], $matches_1[2], $matches_2[2]);
    $input[] = array_combine ($keys, $vals);
}
скрипт по такой же схеме получает textarea'и и select'ы. Это жрёт ресурсы сильно..
Можно ли как - нибудь оптимизировать его? подскажите пожалуйста.
Заранее благодарен!
 

hermit_refined

Отшельник
Во-первых, регулярные выражения неправильны ("&amp;#192;-&amp;#223;" в квадратных скобках - это что?).
Во-вторых, "много жрёт ресурсов" - это фигня. Проверьте профайлером, только после этого можно будет так говорить. Узкое место большинства web-приложений - бд. Даже если в данном случае её нет - не факт, что виноват именно этот кусок кода.
В-третьих - что вы собственно пытаетесь сделать этим кодом?

P.S. А вообще - см. DOM
 

bmn

Новичок
hermit_refined
это русские буквы. (в сообщении исправил)

скрипт парсит ХТМЛ. ищет нужны тэги и значения аргументов соответственно.

проверю профайлером скрипт. результаты сюда выложу.

-~{}~ 08.10.06 00:09:

дело было действительно в базе.
Вопрос закрыт . всем спасибо!
 

itprog

Cruftsman
bmn
зачем в трех $string_tpl* перечислять что можно, если проще что нельзя? да и в одно переписать можно..
 

bmn

Новичок
itprog
я в них не очень силён, как видишь.
Может подскажешь, пожалуйста?
 

hermit_refined

Отшельник
Эти три выражения лично я бы заменил на одно -
PHP:
'@(\w+)\s*=\s*((["\']).*?\\3|\S+)@s'
с последующим trim(..., '"\'') для вторых совпадений - не для оптимизации, а из соображений эстетики, краткости и более точного результата (сейчас строка <input onChange = "something = 17;" ...> будет обработана неправильно).
 
Сверху