За последние 24 часа нас посетили 37336 программистов и 6864 робота. Сейчас ищут 1676 программистов ...

Парсинг подстрок preg_match

Тема в разделе "PHP для новичков", создана пользователем andreyua, 13 мар 2012.

  1. andreyua

    andreyua Активный пользователь

    С нами с:
    3 сен 2010
    Сообщения:
    6
    Симпатии:
    0
    Есть строка
    Код (Text):
    1. sl/ovo / slovo // slovo
    Нужно извлечь только "sl/ovo" и только один раз
    Тоесть, ориентироваться, искать до символов " /", дальше не искать

    Если паттерн такой
    Код (Text):
    1. $pattern = "#.*\s/#";
    То результат такой
    Код (Text):
    1. sl/ovo / slovo /
    А нужен результат такой
    Код (Text):
    1. sl/ovo
    sl/ovo или фраза может быть любой абсолютно, но только, еще раз повторю, извлекать до таких символов " /".
     
  2. AndreJM

    AndreJM Активный пользователь

    С нами с:
    25 янв 2012
    Сообщения:
    522
    Симпатии:
    0
    Код (Text):
    1.  slovo // slovo / sl/ovo
    В этом случае тоже должен извлечь "sl/ovo" ? Или первый элемент всегда тот который нужен?
     
  3. andreyua

    andreyua Активный пользователь

    С нами с:
    3 сен 2010
    Сообщения:
    6
    Симпатии:
    0
    В этом случае извлечь "slovo", потому что за ним идет первое совпадение " /"
     
  4. AndreJM

    AndreJM Активный пользователь

    С нами с:
    25 янв 2012
    Сообщения:
    522
    Симпатии:
    0
    Код (PHP):
    1. $str = 'sl/ovo / slovo // slovo';
    2. $found = current(explode(" /",$str,2);
    3.  
     
  5. andreyua

    andreyua Активный пользователь

    С нами с:
    3 сен 2010
    Сообщения:
    6
    Симпатии:
    0
    Спасибо за решение, но я упоминал регулярки, потому что хотел дальше тестировать ...
    Просто, если в целом - то строки могут быть такие:
    Код (Text):
    1.  
    2. $a = sl/ovo / slovo // slovo (1000);
    3. $b = fraza fraza fraza(1000);
    4. $c = slo/vo (2000)
    5. // и т.д.
    Резултат такой должен быть:
    Код (Text):
    1.  
    2. $a = sl/ovo (1000);
    3. $b = fraza fraza fraza(1000);
    4. $c = slo/vo (2000);
    То есть для $а, извлекать "sl/ovo" и добавлять (1000)
    Строку $b и $c не менять , потом как там нет " /".
     
  6. AndreJM

    AndreJM Активный пользователь

    С нами с:
    25 янв 2012
    Сообщения:
    522
    Симпатии:
    0
    О мифических "потому что хотел дальше тестировать" мне не было ведомо. Смею предположить, что на следующее решение задачи(именно решение) будет также наложено вето "потому что хотел дальше" =)
     
  7. andreyua

    andreyua Активный пользователь

    С нами с:
    3 сен 2010
    Сообщения:
    6
    Симпатии:
    0
    Не будет, точно ...
    Я просто спрашивал вначале, так как хотел понять, как решить первый шаг задачи а потом браться за остальные шаги..
    Если сможете помогите, это уже окончательный вопрос.

    Добавлено спустя 8 минут 21 секунду:
    Я бы мог сделать через кучу IF, strpos, strreplace. Но хочу добиться более элегантного решения.
     
  8. AndreJM

    AndreJM Активный пользователь

    С нами с:
    25 янв 2012
    Сообщения:
    522
    Симпатии:
    0
    Код (PHP):
    1. $a = 'sl/ovo / slovo // slovo (2000)';
    2. $foo = preg_split("/(?=[ \/]*[\s])|(?=[ \/]*[\s][\(])|(?=[ \/]*[\(])/",$a,-1);
    3. $str = current($foo) . ' ' . end($foo);
    4. print $str;
    5.  
     
  9. andreyua

    andreyua Активный пользователь

    С нами с:
    3 сен 2010
    Сообщения:
    6
    Симпатии:
    0
    При
    Код (Text):
    1.  
    2. $a = 'slovo sdsd / slovo2 (2000)';
    3.  
    4. выкидывает
    5. slovo (2000)
    6. а должно
    7. slovo sdsd (2000)
    8.  
    9. при
    10. $a=slovo;
    11. выкидывает
    12. slovo slovo
    13. а должно
    14. просто без изменений..
    15. slovo
     
  10. AndreJM

    AndreJM Активный пользователь

    С нами с:
    25 янв 2012
    Сообщения:
    522
    Симпатии:
    0
    У вас есть мой пример который вы можете доработать,
    я мальца устал от "мифических шаблонов" =)

    Добавлено спустя 1 минут 0 секунд:
    Код (PHP):
    1. $a = 'sl/ovo / slovo // slovo (20020) ';
    2. //$a = 'sl/ovo / slovo // slovo(20020) / sl(1000)';
    3. //$a = 'slovo';
    4. //$a = 'slovo slovos / ee (2000)';
    5. $foo = preg_split("/(?=[\s]*[\s][\/])|(?=[\s][\/]*[\s])|(?=[(*])/",$a,-1);
    6. if(count($foo) > 1)
    7.     $str = current($foo) . ' ' . end($foo);
    8. else $str = current($foo);
    9. print $str;
    10.