опять регулярные выражения

clevel

Новичок
опять регулярные выражения

PHP:
 $start="<table>\n".
        "<tr>\n".
         "<td>field5</td>\n".
         "<td>\n".
          "<select name=clc[5] style=\"blah..blah\" class=select1>\n".
           "<option value=0>first\n".
           "<option value=1 selected>first2\n".
           "<option value=2>first3\n".
           "<option value=3>first4\n".
           "<option value=4>first5\n".
          "</select>\n".
         "</td>\n".
        "</tr>\n".
        "<tr>\n".
         "<td>field6</td>\n".
         "<td>\n".
          "<input type=checkbox name=clc[6]>value".
         "</td>\n".
        "</tr>\n".
        "<tr>\n".
         "<td>field7</td>\n".
         "<td>\n".
          "<select name=clc[7] style=\"blah..blah\" class=select1>\n".
           "<option value=0>first\n".
           "<option value=1>first2\n".
           "<option value=2 selected>first3\n".
           "<option value=3>first4\n".
           "<option value=4>first5\n".
          "</select>\n".
         "</td>\n".
        "</tr>\n".
        "</table>\n";

 $num=5;
 $sel=3;
 $da[]="'<select name=clc\[".$num."\]([^>]*?)>(?(<option value=".$sel.">)(<option value=".$sel." selected>)|(<option value=".$sel.">))</select>'is";
 $da2[]="<select name=clc[".$num."]\\1>\\2</select>";


 echo preg_replace($da,$da2,$start);
что хочется: в кеше формы есть поля, для которых поставлено свойство - автозаполнение. То есть, юзер ранее заполнял аналогичное поле и выбрал тот или иной ответ. Вданном примере надо поле select с именем clc[5] "очистить" от выбранного по дефолту значения и поставить новое поле под номером три как выбранное.
В чем трудности:
1.нельзя сначал удалить все selected, так как не все поля нужно изменять
2.не совсем разобрался с условными подшаблонами в регулярных выражениях. Сейчас данная конструкция пишет ошибки...
Подскажите, как лучше решить мою задачу и правильным ли путем пошел я....
 

Zh0rzh

Новичок
Не очень конкретно сформулирована задача. Это во первых.

Во вторых. Зачем тебе регулярными выражениями заменять что то в форме? Сгенеруруй новую форму, согласно твоим требованиям.
 

clevel

Новичок
в чем трабла... для повышения скорости вывода информации я ее кеширую...
а если потом под конкретного юзера надо заменить значение полей формы, то при помощи регулярных выражений хочу это заменять уже динамично...
почему не конкретно сформулировал? Мне надо
PHP:
$start="<select name=clc[5] style=\"blah..blah\" class=select1>\n". 
           "<option value=0>first\n". 
           "<option value=1 [B]selected[/B]>first2\n". 
           "<option value=2>first3\n". 
           "<option value=3>first4\n". 
           "<option value=4>first5\n". 
          "</select>\n";
заменить на
PHP:
$start="<select name=clc[5] style=\"blah..blah\" class=select1>\n". 
           "<option value=0>first\n". 
           "<option value=1>first2\n". 
           "<option value=2>first3\n". 
           "<option value=3 [b]selected[/B]>first4\n". 
           "<option value=4>first5\n". 
          "</select>\n";
при этом я могу использовать только номер clc[5] и <option value=3> для добавления в нужное место selected и удаления из всех остальных options..
Что еще конкретнее сформулировать?
 

fixxxer

К.О.
Партнер клуба
для повышения скорости вывода информации я ее кеширую...
На бред смахивает... Что, где и откуда кэшируется? Как такое "кэширование" влияет на скорость?

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

clevel

Новичок
На бред смахивает
вовсе нет... я использую шаблоны, именно поэтому и хочу генерить статику для уменьшения нагрузки на сервер и увеличения скорости формирования контента...
Просто при кешировании у меня один простой запрос на выборку из БД, а при полном "ручном" формированиии из шаблонов - 3, при этом еще надо на пхп делать хитрые вычисления...
Просьба: мне надо помочь с регулярными выражениями...
Вопрос, что надо на лету генерить или из кеша, обсуждению не подлежит..
Вы считаете, что на лету лучше, юзайте этот вариант, мне он в моем случае не походит..
 

clevel

Новичок
А вообще - генери форму по-человечески и не парь людям мозги. Или юзай шаблоны, и соответственно тоже не парь людям мозги
у меня приницип смарти шаблонов используется... один раз парситься шаблон и под него генериться статика (где это возможно)... так что не надо ляля насчет "паришь мозги". Я предельно точно описал задачу...
 

fixxxer

К.О.
Партнер клуба
Ну если это "принцип смарти"... Тогда я, видимо, испанский лётчик.
 

fixxxer

К.О.
Партнер клуба
Хотя, и Smarty, конечно, можно использовать через задницу. :)
 

clevel

Новичок
что за наезды!
Если не знаешь, как помочь... не лезь!
Достали уже: все кому не лень лезут критиковать!
Фанат тут в последнее время всех хает, ты туда же...
Кончай офтоп гнать. Вопрос стоял не в том, что хорошо или плохо сделано.. Есть конкретный вопрос: можешь помочь - спасибо, нет - не надо говорить, что все и вся говно...
 

fixxxer

К.О.
Партнер клуба
В общем. Слушай сюда. Вставляешь отметку, куда генерить option-ы, сами option-ы не прописываешь в шаблоне, а генеришь в цикле и пишешь во временную переменную. После этого заменяешь отметку на содержимое временной переменной.

Если хочется option вынести в шаблон (например, если нужно задать option-у какой-то хитрый стиль...ну это все маловероятно, но все-таки,) - почитай про циклические блоки в шаблоных и попробуй реализовать что-то подобное.
 

clevel

Новичок
а зачем шаблоны для options? Моя задача - поставить значение selected для одного элемента, для других этого списка - убрать...
никаких стилей я не собираюсь в оптионс закидывать...
 

Макс

Старожил PHPClub
как вариант, через
$start = preg_replace("!your_regexp!ise", "my_func('\\1', $sel)", $start);
где your_reg - регексп (сходу не напишу), вырезающий
Код:
"<option value=0>first\n". 
           "<option value=1 selected>first2\n". 
           "<option value=2>first3\n". 
           "<option value=3>first4\n". 
           "<option value=4>first5\n".
(то что между <select name=clc[5] ...> и </select>)
в функции my_func() удалить selected и вставить в нужное место.
 

Demiurg

Guest
Если у тебя используется "принцип" smarty, то кешируй так же как смарти. Каждому цешированому шаблону выставляется cashid и по их значениям выбирается нужный. То есть у тебя будут два закешированых документа один с selected другой без. Если закешированые страницы еще и через кучу регов прогонять, то смысла от этого не будет.
 

clevel

Новичок
1.есть ОДИН кеш формы с кучей полей (там используются шаблоны ДИЗАЙНА для полей, стили, и все такое)
2.Если юзер анонимный, то ему выдается форма БЕЗ ИЗМЕНЕНИЙ.
3.Если юзер ранее зарегился. то при НАЛИЧИИ нескольких полей, на которых стоит автозаполнение, надо в этой закешированной форме несколько полей заполнить ранее введенными данными.
Это предельно ясно, что делается.
Умоляю, не лдолбайте меня вопросами/ответами на эту тему: разумно/неразумно, надо/нет!
Я не с этим вопросов обратился...
Вот в чем вопрос: есть условные подшаблоны - Conditional subpatterns, которые, как я понимаю, могут мне помочь решить проблему с вырезанием из <option value=\d selected>
слова selected, если значение value не равно нужному, и вставкой <option value=\d selected> если равно...
тольковот прямая вставка в шаблон выдает ошибку.
Пример шаблона я привел уже в первом топики, однако пошел флейм в сторону , чего надо делать. а что плохо.
Подскажите, куда сувать эти условные подшаблоны для достижжения МОЕЙ ЦЕЛИ, а не ваших домыслов!
4.у меня и так каждой форме присваивается уникальное значение, так что не надо пустых советов по этому поводу...
5.генерить заранее под каждого юзера нет смысла, так как это, вот как раз, и является маразмом...
6.эту конструкцию. с вызовом своей функции для разбора, считаю нецелесообразной, так как подшаблон простой - либо оставляем <option value=\d> либо <option value=\d selected>, ВСЕ! Работа с вызовом функции - вот здесь тогда точно будет притормаживать...
 

Zh0rzh

Новичок
На бред смахивает...
Полностью согласен.

Регулярными выражениями за один раз ты не сделаешь замены по всей формы.
Люди тебе истину говорят - генерируй заново.
 

Yukko

Новичок
Долго размышял, ответить или нет. Решился...
clevel
Регулярные выражения не являются панацеей от всех бед.

Смысл кешировать, если потом данные из кеша будешь менять при помощи РВ? Кеш как раз и нужен для того, чтобы лишний раз не гонять ресурсоемкие процессы, такие как например обработка ВСЕГО текста регулярными выражениями... по нескольку раз.

Представим себе текст, в котором n символов, а также регулярное выражение, в котором
1. есть три условия выбора part1|part2|part3|
2. каждая из частей parti состоит из символьных классов, а также заданных последовательностей литералов.
3. максимальная длинна совпадения регулярного выражения равна m символов.
4. ты используешь функцию preg_replace, значит мы знаем принцип работы механизма РВ, а значит можем повторить его работу.

1. берем символ из текста с индексом 1 пытаемся применить РВ к тексту, который начинается с этого символа. Перебираем каждый символ от начального и сравниваем его с шаблоном (подходит ли).
2. следуя каждой инструкции выбора в РВ мы можем совершить максимум три выбора и перебрать m последующих символов для КАЖДОГО i-го символа текста.
3. несложно посчитать, какое количество символов будет перебрано впустую, если совпадение не будет найдено.
4. закешированный документ уже является результатом работы РВ (многие шаблонизаторы работают на РВ) таким образом ты просто напросто дополнительно вызываешь механизм РВ, чтобы отпарсить сырой документ-полуфабрикат, вместо того, чтобы сразу его сделать готовым за один проход.
6. если сравнить РВ, на которых работают шаблонизаторы и РВ, которое получится у тебя, то сразу будет видно, что первые проще!

Вывод: хотя тебе и трудно с этим смириться, но овчинка выделки не стоит.
 

clevel

Новичок
Yukko, спасибо, это уже позитивная критика, это я ценю.
Но! Что же происходит у меня:
1.Кеш делается для того, чтобы не вызывать каждый раз тремя запросами необходимые шаблоны и потом при помощи пхп делать форму (у меня можно в шаблонах задавать, к каким элементам эти шаблоны применять-> кол-во операций несколько возрастает чем просто проход регулярными выражениями по одному шаблону; так как шаблонов несколько, необходимо изначально определить, к какому по счету элементу его применять. Как вариант простейшей реализации - зебра)
2.Этот кеш не всегда нужно изменять под юзера - только если будет стоять свойство нескольких полей автозаполнение для зарегенных юзеров. Пример - когда юзер уже раз заполнял форму заказа, ФИО, мыло уже будут вставлены. Отсюда следует, что кеш - не сырой полуфабрикат, а готовый текст, который ИНОГДА надо подогнать под вывод.
3.Ты привел простейший алгоритм поиска и замены. Насколько мне известно, в регулярных выражениях стандарта PCRE regex syntax используются более продвинутые и сберегающие мощности железа алгоритмы. Более того, регулярные выражения, как я понял, только один раз проходят исходный текст для того, чтобы заменить все шаблоны, при этом не посимвольно перебирая строку, а через определенный интервал, равный максимальному значению длины шаблона. Поэтому мне они и интересны.
4.Я спросил по поводу условный подшаблонов, подскажите, что я делаю в данном примере (читай первый пост) не так?
Несмотря на критику, мне моя позиция кажется верной, но тем не менее мне нужна максимально статика, и я ее добиваюсь...
 

Andr

Guest
условный подшаблон это

(?(condition)yes-pattern|no-pattern)
да?
The condition should be either an integer, which is "true" if the pair of parentheses corresponding to the integer has matched, or a lookahead, lookbehind, or evaluate, zero-width assertion.
PHP:
$da[] = ... (?(<option value=".$sel."> )( ... ) ...
не правильное, похоже, кондишн...

во такое (например) катит
PHP:
$da[] = ... (?=<option value=".$sel.">( ... ) ...
только как ты его(своё) собираешься использовать... разве что как предложил мсье Матюхин...?

и ещё, если я правильно понимаю, то ОНО ищет <option value=3><option value=3> или <option value=3><option value=3 selected> или ты хотел что-то другое? :)

и не понятно, почему нельзя вот так сделать?
PHP:
$da[]="'<select name=clc\[".$num."\](.*?)(<option value=".$sel.">)(.*?)</select>'is"; 
$da2[]="<select name=clc[".$num."]\\1<option value=".$sel." selected>\\3</select>";
все равно за один заход ты по-моему не сделаешь сразу деселект дефолта и селект правильного. точнее может быть сделаешь, но придется, наверное, знать порядок опшенов
 

clevel

Новичок
знать порядок опшенов
ты имеешь ввиду их все перечислить?
Но зачем?
Ведь между селектами явно идут такие строки:

<option value=1>
<option value=2 selected>
<option value=3>
На мой взгляд, условные подшаблоны и будут выходом, не так ли?
 
Сверху