«Выворачивание мозгов» при помощи регулярных выражений.

ISV

Новичок
«Выворачивание мозгов» при помощи регулярных выражений.

На первый взгляд простая задача, выбрать сгруппировано переменные и значения переменных: ? имя переменной начинается с буквы или символа подчёркивания, с последующими (в любом количестве) буквами, числами или символами подчёркивания = значение переменной & имя переменной начинается с буквы или символа подчёркивания, с последующими (в любом количестве) буквами, числами или символами подчёркивания = значение переменной & и т.д.

Смог реализовать лишь:
/([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)(?=\=)/

А вот значения переменных, как только не «плясал с бубном» и обратным утверждением и условным субпатерном, даже рекурсию патернов пробовал. Может, для кого-то это просто, помогите, пожалуйста.
 

Gorynych

Посетитель PHP-Клуба
читал, много думал, не смог понять

вот это вот::= ?<пара>[&<пара>]

где пара::=<имя_переменной>=<значение_переменной>

это совершенно случайно не строка запроса и, соответственно, не УЖЕ разобрано в массив $_GET?

что на самом деле Вы пытаетесь сделать?
 

ISV

Новичок
не УЖЕ разобрано в массив $_GET?
в том и дело, что не УЖЕ. Это заманчиво просто, но загвоздка вот:
<td><div align="center"><a href="{$arr_name_file_right[navigation_field_right]|mod_link:false}">{$arr_name_link_right[navigation_field_right]}</a></div></td>
mod_link - есть модификатор, а модификатор (plugin Smarty) реализуюет воздействие на переменную $arr_name_file_right[navigation_field_right].
Я глубоко пока сомневаюсь, что $_GET смогет бежать впереди паровоза. Хотя, подумать можно... затереть, затерять, обновить ее просто во всех хитросплетениях. На данный момент в голове модифицировать линку до того как она отобразится в шаблоне.
 

WP

^_^
Чего-то я не врубился, в чем дело? Объясни толком что ты хочешь сделать.
 

ISV

Новичок
Объясни толком
Для начала: <a href="{$arr_name_file_right[navigation_field_right]|mod_link:false}"> - это линки собираются из методов различных классов где они определены, но линки разнобразно передаются, например по base64_encode и не только.
Мне нада получать и получаю в переменную модификатор mod_link линку и делать дефракцию на переменные и значения (а вот не хватает интеллекта написать регулярное выражение, не силен), чтобы в дальнейшем использовать эти переменные и значения.
 

baev

‹°°¬•
Команда форума
ISV, а можно по-простому, без всяких умных слов?
(Я из последнего «толкового объяснения» вообще нифига не понял...)

Типа: «есть вот это (пример), а хочу получить вот это (тоже пример)».
 

Gorynych

Посетитель PHP-Клуба
ISV

1) "линки" вообще-то "передаются" скорее по http://ru.php.net/urlencode , чем по base64.

2) очень понравилось "делать дефракцию"

3) может что-то такое поможет (отладочная печать - для понимания промежуточных результатов):
Код:
$url = "http://host.com/path/script.php?action=".urlencode('тест')."&nonpaired="."&t=".date("YmdHis");
echo "$url\n";

$urlScheme = parse_url($url);
var_dump($urlScheme);

if ( isset($urlScheme['query']) ) {
    if ( preg_match_all("/(\w+)=([^&]*)(&|$)/", $urlScheme['query'], $match) ) {
        $key = $match[1];
        $val = $match[2];
        foreach( $key as $k=>$v ) {
            echo "$v = ".( $val[$k] ? urldecode($val[$k]) : null )."\n";
        }
    }
}
 

ISV

Новичок
Gorynych

Спасибо, за /(\w+)=([^&]*)(&|$)/.
1) "линки" вообще-то "передаются" скорее по http://ru.php.net/urlencode , чем по base64.
Согласен. И так тоже. base64 я привел к примеру.

Еще раз спасибо Gorynych! Я в регулярных выражениях не силен и твой пример оказался для меня весьма полезным.
 

ISV

Новичок
WP

Автор оригинала: WP
[m]parse_str[/m]?
Спасибо, WP. Тоже вариант! А то я зациклился на регулярных выражениях :) Это больше психологическое... то чего меньше знаю, больше применять, чтобы свободно владеть.
 

Gorynych

Посетитель PHP-Клуба
ISV
читать (как минимум) - http://ru.php.net/manual/en/reference.pcre.pattern.syntax.php

если регулярные выражения пока сложны, то почти всегда можно использовать последовательно разбиение через http://ru.php.net/split

в данном случае можно бы было посплитить строку параметров сначала на пары (одна от другой отделяется символом '&'), а затем массив пар разбить на ключ-значение, посплитив по символу '='

"фишка" с \w основана на том, что под "словом" понимается (на самом деле) набор символов допустимых в именах переменных. При этом это набор из символов алфавита, цифр и подчерка, а значит он расширяется символами национального алфавита. Но в данном случае это не важно

([^&]*) - множество символов ОТЛИЧНЫХ от &.

третья группа (&|$) подразумевает символ & или конец строки
 

ISV

Новичок
Gorynych

Автор оригинала: Gorynych
ISV
читать (как минимум) - http://ru.php.net/manual/en/reference.pcre.pattern.syntax.php

если регулярные выражения пока сложны, то почти всегда можно использовать последовательно разбиение через http://ru.php.net/split

в данном случае можно бы было посплитить строку параметров сначала на пары (одна от другой отделяется символом '&'), а затем массив пар разбить на ключ-значение, посплитив по символу '='

"фишка" с \w основана на том, что под "словом" понимается (на самом деле) набор символов допустимых в именах переменных. При этом это набор из символов алфавита, цифр и подчерка, а значит он расширяется символами национального алфавита. Но в данном случае это не важно

([^&]*) - множество символов ОТЛИЧНЫХ от &.

третья группа (&|$) подразумевает символ & или конец строки
ну, читать как минимум приятнее http://ru.php.net/manual/ru/reference.pcre.pattern.syntax.php, что и делал... тут еще нада время, чтобы дошло :). Посплитить тоже совет, что нада. :rolleyes: Синтаксис регулярных как-то мозги напрягает нехило, но и эффективность применения не слабая.
 

Gorynych

Посетитель PHP-Клуба
ISV
если действительно хочется регулярных выражений а особого опыта в них нет, то читать приятнее:

1. PHP в деталях > Регулярные выражения, части I и II

- http://phpclub.ru/detail/article/regexp_1
- http://phpclub.ru/detail/article/regexp_2

хотя лично мне там не все нравится/устраивает :)


а еще полезнее:

1. "Регулярные выражения. Карманный справочник"
- http://findbook.ru/search/d1?title=%D0%E5%E3%F3%EB%FF%F0%ED%FB%E5+%E2%FB%F0%E0%E6%E5%ED%E8%FF+%CA%E0%F0%EC%E0%ED%ED%FB%E9+%F1%EF%F0%E0%E2%EE%F7%ED%E8%EA&r=0&s=1&viewsize=15&startidx=0

я бы сказал, что стоит найти исходный MRE (Mastering Regular Expressions) http://www.oreilly.com/catalog/regex/ , который у нас издавался под названием "Регулярные выражения", но это может оказаться во-первых трудным, а во-вторых тяжелым.

2. "PHP Сборник рецептов"
- http://findbook.ru/search/d1?title=PHP+%D1%E1%EE%F0%ED%E8%EA+%F0%E5%F6%E5%EF%F2%EE%E2&r=0&s=1&viewsize=15&startidx=0

точно помню, что там есть как минимум посвященная им глава (еще одна улыбка тут :) ) + вообще в книге собрана масса полезных практических приемов
 
Сверху