За последние 24 часа нас посетили 55305 программистов и 1725 роботов. Сейчас ищут 1130 программистов ...

Не работает регулярное выражение

Тема в разделе "PHP для новичков", создана пользователем riaron, 15 янв 2019.

  1. riaron

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

    С нами с:
    1 окт 2014
    Сообщения:
    247
    Симпатии:
    4
    Надо param со значением 3 заменить на hello
    PHP:
    1. $string="https://www.somehost.com/test/index.html?param1=4&param2=3&param3=2&param4=1&param5=3";
    2. $pattern = '/^[a-z]{5}[0-9]{1}[=]{1}3$/';
    3. $replacement = 'hello';
    4. echo preg_replace($pattern, $replacement, $string);
     
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.816
    Симпатии:
    1.332
    Адрес:
    Лень
  3. riaron

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

    С нами с:
    1 окт 2014
    Сообщения:
    247
    Симпатии:
    4
    в strtr указываешь определенный промежуток строки и заменяешь на другую а, как бы не знаю какой именно param имеет значение 3
     
  4. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.816
    Симпатии:
    1.332
    Адрес:
    Лень
    ты само значение то поменяй, чуть глобально смотри на ссылку свою, тебе только =3
     
  5. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    А я вот не могу понять, что именно требуется заменить. Например, нашли мы "param2=3". Теперь есть три варианта развития событий с заменой:
    1. param2=hello
    2. hello=3
    3. hello

    P.S. @riaron Ограничения начала и конца строки уберите. Т.е. в регулярке вашей символы ^ и $ точно не нужны
     
    #5 Deonis, 15 янв 2019
    Последнее редактирование: 15 янв 2019
  6. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.816
    Симпатии:
    1.332
    Адрес:
    Лень
    @Deonis, тоже думал про 3 вариант
     
  7. twim32

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

    С нами с:
    29 мар 2017
    Сообщения:
    275
    Симпатии:
    58
    Код (Text):
    1. /(?![a-z]{5}\d{1}=)3/
    или
    Код (Text):
    1. /[a-z]{5}\d{1}(?!=3)/
     
  8. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    PHP:
    1. echo preg_replace('/param3=[^&]+/', 'hello', $string);
     
  9. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    Тогда уж:
    PHP:
    1. $string='https://www.somehost.com/test/index.html?param1=4&param2=3&param3=2&param4=1&param5=3';
    2. if(rand(1,2) === 1) {
    3.     $str = preg_replace('/=3/', '=hello', $string);
    4. } else {
    5.     $str = str_replace('=3', '=hello', $string);
    6. }
    7. var_dump($string, $str);
    :D
     
  10. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    @Sail, не катит. "param=333"
     
  11. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    В общем, ждал я когда ТС уточнит свой вопрос, но похоже, что он на него забил и интерес остался только у отвечающих.

    Исходный "param=3"

    1. Если на выходе должно быть "param=hello"
    PHP:
    1. $str = preg_replace('/(?<==)3(?=&|$)/', 'hello', $string);
    2. Если на выходе должно быть "hello=3"
    PHP:
    1. $str = preg_replace('/([^&]+)(?=(=3(&|$)))/', 'hello', $string);
    3. Если на выходе должно быть просто "hello"
    PHP:
    1. $str = preg_replace('/([^&]+)=3(?=&|$)/', 'hello', $string);
     
  12. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    Увы и ах.
    Однако, ретроспективная проверка - явно лишняя.
     
  13. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Обязательно через регулярку? А если аргумент дважды встречается? Нагляднее разобрать урл по компонентам, пошамаминть с запросом и собрать урл обратно.