На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: ALXR, Pr0[)!9Y, Profi
  
    > Не работают условные подмаски
      Упрощенно сформулирую задачу.

      Надо php сделать парсер параметров, которые записаны в виде:

      переменная=значение

      Каждая такая пара разделена пробелами.

      Теперь мне нужно как-то записывать значения параметров, в которых есть пробелы. Хочу в этом случае писать так:

      переменная={значение с пробелами}

      Почему-то не работает даже такой условный шаблон
      =(?(\{)[\w\s]+\}|[\w]+)

      Сообщается: Compilation failed: assertion expected after (?( at offset 9 in

      Хотя он не то, что мне нужно, он забирает и правую скобку. Хотелось бы в одну маску забирать только значение переменной без всяких скобок.
      Сообщение отредактировано: S.Eugene -
        ну во первых после знака вопроса должен стоять знак равно. ну и во вторых нужно выделить условие в группу
        Цитата
        =((?={)[^}]+}|[^\s]+)
        select name, telephone from Girls where age between 20 and 25 and (.)(.) >= 2 order by IQ desc limit 1
          Цитата ViktorXP @
          ну во первых после знака вопроса должен стоять знак равно. ну и во вторых нужно выделить условие в группу
          Цитата
          =((?={)[^}]+}|[^\s]+)


          Но ведь (?= означает условия на последующий текст. :-?
          http://php.net/manual/ru/regexp.reference.assertions.php

          И потом, ваш шаблон из xxx={yyy} выхватит yyy}, а нужно yyy.

          Вообще, хочу как-то использовать условные подмаски
          http://php.net/manual/ru/regexp.reference.conditional.php

          Если встретили скобку {, то проверяем по одному шаблону, если не встретили, то другому. Причем наличие правой скобки тоже надо требовать условно.
          Сообщение отредактировано: S.Eugene -
            ну можно взять в группу и убить последнюю скобку.
            Цитата
            =((?={){([^}]+)|[\w]+)


            просто не совсем понятно что ты хотел с самого начала. если поддерживает движок то можно вообще воспользоватся "просмотром вперед"
            Цитата
            (?<=={)[\w\s\d]+|(?<==)[\w\d]+

            https://regex101.com/r/uO0xA7/1
            select name, telephone from Girls where age between 20 and 25 and (.)(.) >= 2 order by IQ desc limit 1
            1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script Execution time: 0,0717 ]   [ 14 queries used ]   [ Generated: 6.12.19, 23:51 GMT ]