За последние 24 часа нас посетили 19793 программиста и 1694 робота. Сейчас ищут 1645 программистов ...

Циклическая замена со счетчиком

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

  1. kuraga

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

    С нами с:
    16 фев 2008
    Сообщения:
    97
    Симпатии:
    0
    В строке "Что-то $1, что-то $2 и что-то $3" заменить "$1" на $var[1], "$2" на $var[2] и т.д. Как это сделать? А если не "$1", а "{1}" ("Что-то {1}, что-то {2} и что-то {3}")? Заранее спасибо.
     
  2. kuraga

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

    С нами с:
    16 фев 2008
    Сообщения:
    97
    Симпатии:
    0
    Люди, ну помогите....
     
  3. antonn

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

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    используй preg_replace_callback(), там можно вызвать внешнюю процедуру, а раз она внешняя, значит сделать можно что угодно :)
     
  4. kuraga

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

    С нами с:
    16 фев 2008
    Сообщения:
    97
    Симпатии:
    0
    Пожалуйста, точнее, я в регулярках ноль...
     
  5. Cron

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

    С нами с:
    10 июл 2008
    Сообщения:
    289
    Симпатии:
    0
    Адрес:
    Украина, Сумы
  6. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    preg_replace('/\$(\d+)/', '$var[\1]')
    preg_replace('/{(\d+)}/', '$var[\1]')
     
  7. kuraga

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

    С нами с:
    16 фев 2008
    Сообщения:
    97
    Симпатии:
    0
    MiksIr
    спасибо!

    еще один вопрос - а в javascript так можно?
     
  8. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    В принципе да.
    Там есть класс RegEx
     
  9. kuraga

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

    С нами с:
    16 фев 2008
    Сообщения:
    97
    Симпатии:
    0
    проблема в том, что в яс, насколько я понимаю, вычисление переменной должно произойти в любом случае до выполнения регулярки.
     
  10. Argentum

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

    С нами с:
    31 окт 2007
    Сообщения:
    24
    Симпатии:
    0
    Адрес:
    Москва
    Братцы, а вот как решить исходную задачку при условии, что заменяемые фрагменты вообще одинаковые?

    Вот такая строчка:
    Код (Text):
    1. хрю-хрю smth. гав-гав smth. бе-бе smth.
    должна превратиться вот в такую:
    Код (Text):
    1. хрю-хрю 1 гав-гав 2 бе-бе 3
    То есть, нужен тупо счётчик замен. При этом он не зависит от маски поиска. Как сие сделать?
     
  11. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    или с калбеком, как в 3-ем сообщении, или см. модификатор `e' у регекспа
     
  12. Argentum

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

    С нами с:
    31 окт 2007
    Сообщения:
    24
    Симпатии:
    0
    Адрес:
    Москва
    А можно живой пример? Модификаторы 'e' и 'ee' я щас ковыряю, пока с переменным успехом :) Что касается функции "кол-в-зад", то тут трудность, имхо. Чтобы счётчик замен работал, эта функция должна получать его в качестве аргумента. А также должна возвращать новое значение. А функция принимает и возвращает только массив поиска/замены...
     
  13. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Argentum, в случае калбеков используйте или глобальную переменную или класс со свойством, где уже будет счетчик. Или preg_replace('/smth/e', '++$i;', $subj);
     
  14. antonn

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

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    никакого модификатора "e", только калбэк, модификатор - глючная затея
     
  15. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Обоснуйте.
     
  16. antonn

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

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
  17. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    И? Достаточно знать, что кавычки квотятся. И что в одинарных кавычках они обратно не расквотятся. Если проблема с запоминанием таких вещей - это не значит, что затея "глючная". И уж тем более не повод кричать теперь об этом на каждом углу даже там, где вообще никаких подстановок нет.
     
  18. antonn

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

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    и только ковычки?
    а если пофиксят?
    а если почитать комментарии к этой функции на "мануале"?

    каких подстановок? тебе в функцию вернется текст испорченый. Это повод.
     
  19. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    какую функцию.... где ты в моем примере вообще подстановку видишь, не говоря уже о функции
    Что пофиксят? Это не баг. Если бы они не прогоняли подстановки через addslashes - эти подстановки вообще нельзя было бы использовать как параметры какой-то функции - любая кавычка тогда бы приводила к фаталу. Просто это нужно знать и помнить - что кавычки эскейпятся и что если ты их используешь как параметр - их нужно потом разэскейпить. Нужно просто понять как это работает, а не бросаться "лажами" и глючными затеями.
     
  20. antonn

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

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    Они не вызывают addslashes() в том то и дело. Если вызывали именно ее - я бы не ругался.

    это написано в документации?

    ну и:
    нигде. тут есть и другие сообщения, к которым я отвечал.
     
  21. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    В документации очень много не написано. Есть где вообще ничего не написано - и что же, не использовать?
    Возможно эскейпят только " и ' - какая разница то?
     
  22. antonn

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

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    Это не стандартизированно, если в будущем вдруг исправят, а я буду тупо реплейсить \" в ", то придется исправлять.
    К тому же есть лишенное этих недостатков _callback
     
  23. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Что исправят?!... Что такое "стандартизировано"?! Это не баг, что бы его исправлять. Ладно, проехали, пусть для вас модификатор e будет "тупо и глючно", в конце концов от этого модификатору хуже не будет.
     
  24. antonn

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

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    это значит, что если бы он прогонялся функцией addslashes(), то можно было получить исходный текст при помощи stripslashes().