Разбор строки на части

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

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

    scvorec Создатель

    Регистр.:
    9 ноя 2007
    Сообщения:
    33
    Симпатии:
    1
    Нуждаюсь в помощи по составлению регулярки на РНР.
    На входе могут быть такие строки:
    HTML:
    1. 100
    2. +100 цыпленок
    3. -25.12 в какафку
    4. -434р
    5. \я текст
    6. %$32,3
    7. 100$ забухал
    
    На выходе разбить на переменные, например так:
    HTML:
    
    1. $var1 = "100"; $var2 = ""; $var3 = "";
    2. $var1 = "+100"; $var2 = ""; $var3 = "цыпленок";
    3. $var1 = "-25"; $var2 = ""; $var3 = "в какафку";
    4. $var1 = "-434"; $var2 = "р"; $var3 = "";
    5. $var4 = "я текст";
    8. $var5 = "$32,3";
    9. $var1 = "100"; $var2 = "$"; $var3 = "забухал";
    
    Т.е. отдельно разбить на число, символ после числа, и сам текст
    Некоторые закономерности:
    1. после числа может быть только 1 символ: Р,S,E,$ без учета регистра
    2. После числа с символом должен идти пробел
    3. Числа могут быть не целыми с разделителем . или ,
    4. Длина числа не больше 7 символов
    5. Строка может начинатся только с цифры или символов +,-,%,\
     
  2. CNiks0N

    CNiks0N lamp.root

    Регистр.:
    28 ноя 2008
    Сообщения:
    230
    Симпатии:
    48
    Твои условия немного противоречат примерам, проверь, так ли ты хочешь
     
  3. scvorec

    scvorec Создатель

    Регистр.:
    9 ноя 2007
    Сообщения:
    33
    Симпатии:
    1
    проверил, вроде все правильно
     
  4. diavolic

    diavolic

    Регистр.:
    17 мар 2010
    Сообщения:
    522
    Симпатии:
    102
    вот кусок кода. "собирал на коленках", в деле не проверял. будут ошибки, пиши, поправим.

    PHP:
    // $st строка из множества строк. можно получать в цикле.

    if (preg_match("/([\+\-]?[0-9\.,]{1,7})([РSE\$]?) ([^\n]*)/i"$st$rg))
    {
    $var1 $rg[1];
    $var2 $rg[2];
    $var3 $rg[3];
    }
    if (
    preg_match("/\\([^\n]*)/i"$st$rg))
    $var4 $rg[1];
    if (
    preg_match("/%([^\n]*)/i"$st$rg))
    $var5 $rg[1];
     
  5. scvorec

    scvorec Создатель

    Регистр.:
    9 ноя 2007
    Сообщения:
    33
    Симпатии:
    1
    Ругается на вторую регуляку, которая обрабатывает "\текст"
    HTML:
    Warning: preg_match() [function.preg-match]: Compilation failed: unmatched parentheses at offset 7
    Но самый последний if обрабатывает, хоть и ругается, а два первых нет.

    Первую регулярку я собрал был до вашего коммента вот так:
    HTML:
    ([-\+]?[0-9\.,]{1,7})([РSE\$]?)(.*)$
    Не знаю насколько правильно, но работало:ah:
     
Статус темы:
Закрыта.