"Обезопасить" регулярку

Тема в разделе "Регулярные выражения", создана пользователем alexz15, 4 авг 2012.

Статус темы:
Закрыта.
Модераторы: xpert13
  1. alexz15

    alexz15

    Регистр.:
    3 окт 2008
    Сообщения:
    394
    Симпатии:
    190
    Приветствую!

    есть макрос:
    [M_AKROS-{Z}-X-Y]

    где
    AKROS - любое слово строчными буквами от 3-х до 15 символов, разрешен символ "_"
    Z - любые символы
    а X-Y - числа от 1 до 999

    подскажите плз регулярку, которая найдет строго по заданному макросу, т.е. если например в шаблоне будет макрос написан так:
    [M_AKROS-{Z}-X-Y
    или так:
    [M_AKROS-{Z-X-]
    или еще как-нибудь не верно, то чтобы он не обрабатывал его.

    я сейчас делаю таким образом:
    PHP:
    while(strstr($templ"[M_")){
        
    preg_match("#\[M_([A-Z\_]{3,15})-\{(.+?)\}-([0-9]{1,3})-([0-9]{1,3})\]#"$templ$m);
    }
    но если написан неверно макрос, то скрипт начинает "думать".
     
  2. alexz15

    alexz15

    Регистр.:
    3 окт 2008
    Сообщения:
    394
    Симпатии:
    190
    PS.

    AKROS - не строчные, а заглавные буквы :)
    Z - любые символы, включая html
     
  3. DrakonHaSh

    DrakonHaSh

    Регистр.:
    29 июн 2010
    Сообщения:
    358
    Симпатии:
    122
    Z, как я понимаю, все-таки не любые символы, а все символы, кроме }

    PHP:
    $templ "
    [M_AKROS-{zzzz}-1-133]
    [M_AK_ROS-{zzzz}-1-133]
    [M_AKROS-{zzzz-1-1]
    [M_AK_ROS-{zzzz}-1-1334]
    "
    ;
    preg_match_all("#\[M_([A-Z_]{3,15})-\{[^}]*\}-([0-9]{1,3})-([0-9]{1,3})\]#"$templ$m,PREG_SET_ORDER);
    echo 
    "<pre>";
    print_r($m);
    =>
    Код:
    Array
    (
        [0] => Array
            (
                [0] => [M_AKROS-{zzzz}-1-133]
                [1] => AKROS
                [2] => 1
                [3] => 133
            )
    
        [1] => Array
            (
                [0] => [M_AK_ROS-{zzzz}-1-133]
                [1] => AK_ROS
                [2] => 1
                [3] => 133
            )
    
    )
    
    []
     
    alexz15 нравится это.
Статус темы:
Закрыта.