За последние 24 часа нас посетили 17945 программистов и 1642 робота. Сейчас ищут 1119 программистов ...

Одна регулярка

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

  1. rar

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

    С нами с:
    9 дек 2008
    Сообщения:
    206
    Симпатии:
    0
    Адрес:
    Москва
    Есть строка:
    PHP:
    1. $str = "123456786768678678"; // Может содержать любую последовательность произвольных цифр
    Надо её отформатировать в такой формат: X.XXX.XXX.XXX.XXX.XXX.XXX.X и тд. То есть, после 1-ой цифры ставим точку, и далее ставим точку после каждых 3-х цифр. Помогите, что-то совсем не въезжаю как такое сделать.
     
  2. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    строка в пхп - есть массив
    работай с ней как с массивом
     
  3. rar

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

    С нами с:
    9 дек 2008
    Сообщения:
    206
    Симпатии:
    0
    Адрес:
    Москва
    Спасибо. Действительно можно свою функцию написать и ей парсить строку. Но мне надо именно с использованием регулярных выражений этого добиться. Вроде на Перле такое можно делать. Даже знаю, что надо использовать опережающую проверку. Только вот, не пойму как.
     
  4. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Позитивный lookahead работает только с фиксированным количеством символов, там нельзя делать никаких [0-9]+
    Во-вторых, ЛИЧНО Я не вижу никаких рациональных способов реализации подобного регулярными выражениями, хотябы в первую очередь потому, что количество символов в строке варьируется и первый символ акцентируется отдельно.
     
  5. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    Apple
    да можно и регулярками
    что-то типа
    preg_replace("#(?<!\.)(\d{3})#",".\\1")
     
  6. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Mr.M.I.T.
    A если строка вида ххххх он её разберет как х.ххх.х ?
    Или строку хх как х.х? Или хххххх как х.ххх.хх ?
    Разгребет такое? =)

    Я пока спотыкаюсь о первый символ.
     
  7. rar

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

    С нами с:
    9 дек 2008
    Сообщения:
    206
    Симпатии:
    0
    Адрес:
    Москва
    Не важно что там в конце, главное, чтобы первая точка отделила один символ, а дальше по три, если там не будет кратности, по фигу.
     
  8. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    Apple
    с первым - 2 регулярки
     
  9. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    PHP:
    1. <?
    2. $str="1234567890";
    3.  
    4. $str=preg_replace("#^(\d{1})#","\\1.",$str);
    5. $str=preg_replace("#(\d{3})(?!(?:\.|$))#","\\1.",$str);
    6.  
    7. print $str;
    8. ?>
     
  10. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    а можно и в одну
    PHP:
    1. <?
    2. $str="123433454567890";
    3.  
    4. $str=preg_replace("#(
    5.                      (?(?<=^)
    6.                           ^\d{1}
    7.                        |
    8.                           \d{3}
    9.                             (?!
    10.                                (?:\.|$)
    11.                             )
    12.                        )
    13.                      )#x","\\1.",$str);
    14.  
    15. print $str;
    16. ?>
     
  11. rar

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

    С нами с:
    9 дек 2008
    Сообщения:
    206
    Симпатии:
    0
    Адрес:
    Москва
    Спасибо большое.

    Только вот здесь не пойму:
    PHP:
    1. <?
    2. $str = "12345678934543535454350";
    3.  
    4. $str = preg_replace("/^(\d{1})/", "\\1.", $str);
    5.  
    6. print $str;
    7. ?>
    ^(\d{1}) - захват первой цифры. \\1 - так мы её вставляем, далее ставим точку. Должно получиться: "1.". Каким образом всё остальное, то, что после единицы, туда попадает? На выходе странным образом для меня получается: "1.2345678934543535454350". Объясните пожалуйста.
     
  12. rar

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

    С нами с:
    9 дек 2008
    Сообщения:
    206
    Симпатии:
    0
    Адрес:
    Москва
    А понял, она делает замену того, чего найдет.
     
  13. rar

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

    С нами с:
    9 дек 2008
    Сообщения:
    206
    Симпатии:
    0
    Адрес:
    Москва
    Есть вот такой вариант, очень простой:

    PHP:
    1. <?
    2. $str = "564567867686786785646467567876786786786997889787897979978976";
    3. $str = preg_replace("/(\d)(\d{2})/", "\\1.\\2", $str);
    4. print $str // Выводит: 5.645.678.676.867.867.856.464.675.678.767.867.867.869.978.897.878.979.799.789.76
    5. ?>