За последние 24 часа нас посетили 17840 программистов и 1286 роботов. Сейчас ищут 1409 программистов ...

Помогите обработать строку

Тема в разделе "Регулярные выражения", создана пользователем maksia, 26 июн 2007.

  1. maksia

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

    С нами с:
    8 ноя 2006
    Сообщения:
    45
    Симпатии:
    0
    Адрес:
    Москва
    Здравствуйте!
    Есть строка вида
    PHP:
    1. $string = "1.2.840.113549.1.9.1=некий текст1, 2.5.4.7=некий текст2, 2.5.4.10=некий текст3";
    Как и нее получить, напрмер, значение 2.5.4.7?
    Сам пока допер только до того, что возвращается значение вида 2.5.4.7=некий текст2, а не некий текст2.
    Помогите пожалуйста, кто может.
     
  2. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    это типа IP адреса?
     
  3. maksia

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

    С нами с:
    8 ноя 2006
    Сообщения:
    45
    Симпатии:
    0
    Адрес:
    Москва
    Это OIDы - объектные идентификаторы. Номера OIDов заранее известны, а вот текст после знака равно изменяется. Собственно тест и нужно получить для дальнейшей работы с ним.
     
  4. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    strpos() + substr() + strlen()
    Работай с ними, найди позицию OID'a в строке, прибавь к этой позиции длинну строки OID'a и ещё 1 (это знак "=") - получишь позицию, где начинаеться текст для OID'a. Далее тебе надо узнать позицию, где заканчиваеться текст для OID (если это запятая, то делаем strpos(',', $text, $position) где $position - это позиция начала текста для OID'a - для чего это нужно читай в мануале).
    Теперь ты знаешь позицию старта и конца, применяем substr().

    алгоритм я тебе дал, тебе осталось написать код :)
     
  5. maksia

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

    С нами с:
    8 ноя 2006
    Сообщения:
    45
    Симпатии:
    0
    Адрес:
    Москва
    Psih
    Спасибо! Буду пробовать, а то зациклился на регулярках =)
     
  6. stas_t

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

    С нами с:
    24 апр 2007
    Сообщения:
    500
    Симпатии:
    0
    Адрес:
    Courbevoie, France
    PHP:
    1. <?php
    2.     $string = "1.2.840.113549.1.9.1=некий текст1, 2.5.4.7=некий текст2, 2.5.4.10=некий текст3";
    3.     $oid = '2.5.4.7';
    4.  
    5.     preg_match ("/$oid\s*=\s*(.+?)(?:,\s*\d+(?:\.\d+)+\s*=|$)/", $string, $matches);
    6.  
    7.     echo $matches[1];
    8. ?>
     
  7. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    stas_t
    Заколите меня колом, если я понимаю что-либо в данной регулярке... Смотришь на это и понимаешь - для того, что бы это понять, нужен мануал и N'ое кол-во времени. Лучше уж моим вариантом.

    З.Ы. Я сам люблю регулярки (и на работе всем с ними помогаю, потому что их больше никто не любит и не знает толком), но не всё подряд же терь в них пихать :)
     
  8. Davil

    Davil Guest

  9. maksia

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

    С нами с:
    8 ноя 2006
    Сообщения:
    45
    Симпатии:
    0
    Адрес:
    Москва
    stas_t
    Спасибо большое! Ваш способ то что надо =)
     
  10. Vitas

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

    С нами с:
    7 фев 2006
    Сообщения:
    595
    Симпатии:
    0
    Адрес:
    Новосибирск, Академгородок
    stas_t, жжоско.
     
  11. stas_t

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

    С нами с:
    24 апр 2007
    Сообщения:
    500
    Симпатии:
    0
    Адрес:
    Courbevoie, France
    пардон, поторопился. перед $oid надо ещё кое что подставить...
    "/(?:^|[^.\d])$oid..."
     
  12. maksia

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

    С нами с:
    8 ноя 2006
    Сообщения:
    45
    Симпатии:
    0
    Адрес:
    Москва
    stas_t
    Странно, но и без подстановки все работает нормально. А для чего подстановка нужна?
     
  13. stas_t

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

    С нами с:
    24 апр 2007
    Сообщения:
    500
    Симпатии:
    0
    Адрес:
    Courbevoie, France
    без подстановки может слопать все следующие последовательности, что не есть хорошо:
    2.5.4.7
    22.5.4.7
    2.2.5.4.7

    подстановка должна гарантировать только первый вариант. хотя, сейчас вот посмотрел и снова решил переписать. похоже, подстановка должна быть следующая:
    (?:^|,\s*)