Как заменить неизвестную строку? (известен только шаблон)

1

Я хочу заменить строку, которая может отображаться в URL-адресе.

Строка имеет следующий шаблон:

%26TID%3D123456

  1. Я хочу заменить часть 123456 на определенное значение, например: 777777.

  2. Однако, чтобы быть в безопасности, я не хочу предполагать, что соответствующая часть исходной строки обязательно имеет 6 цифр после %3D части; Я хочу предположить, что исходная строка может содержать несколько или несколько меньших символов (и я также не могу определить реальное значение каждой цифры).

  3. Кроме того, когда я заменяю строку, поскольку эта строка обычно появляется в середине URL-адреса, мне нужно заменить ее, не изменяя остальную часть URL-адреса. После этой строки обычно будет другая строка %26 которую я хочу сохранить, включая все, что после нее, но чтобы быть в безопасности, я не хочу предполагать, что исходной строке обязательно следует %26.

Какова наилучшая практика для такой замены, которая будет соответствовать всем моим вышеперечисленным условиям?

  • 0
    Ну, вы уже отметили свой вопрос с лучшей практикой imho: Используйте регулярные выражения (регулярное выражение). Вы пробовали что-нибудь подобное? Если да, то что именно? И какие результаты вы получили? Как они отличались от ваших ожиданий? Регулярные выражения также можно использовать для замены в PHP, см. Preg_replace ()
  • 0
    Похоже, что вы закодировали пары ключ-значение в своем URL как %26 - это & а %3D - = . Поэтому вам, вероятно, следует проанализировать строку, получить и изменить ключи или значения, которые необходимо изменить, и снова закодировать ее.
Показать ещё 16 комментариев
Теги:
string

1 ответ

1
Лучший ответ

Общее правило заключается в том, чтобы указать границу (или "привязку") (здесь, начальную), а затем сопоставить все, что вы хотите, с более общим шаблоном.

Здесь "anchor" - это буквальный текст TID%3D. Более общий шаблон - одна или несколько цифр: \d+.

Поскольку вам нужно заменить первое вхождение, вам нужно передать значение 1 в качестве значения предельного аргумента в preg_replace.

Итак, объединив все это:

$re = '~TID%3D\d+~'; 
$str = "%26TID%3D123456 %26PID%3D123456 %26TID%3D123456"; 
$subst = 'TID%3D7652'; 
echo $result = preg_replace($re, $subst, $str, 1);
// = > %26TID%3D7652 %26PID%3D123456 %26TID%3D123456

См. Демонстрацию IDEONE

Если вы не хотите (или не знаете) "якорный" текст, используйте механизм захвата (demo):

$re = '~(TID%\w{2})\d+~'; // (...) specify a capturing group referenced with ${1} later 
$str = "%26TID%3D123456 %26PID%3D123456 %26TID%3D123456"; 
$subst = '${1}7652'; 
echo $result = preg_replace($re, $subst, $str, 1);
// = > %26TID%3D7652 %26PID%3D123456 %26TID%3D123456

Вы также можете использовать подход lookbehind, но он менее эффективен:

$re = '~(?<=TID%3D)\d+~';  // (?<=TID%3D) makes sure digits are preceded with TID%3D substring
$str = "%26TID%3D123456 %26PID%3D123456 %26TID%3D123456"; 
$subst = '${1}7652'; 
echo $result = preg_replace($re, $subst, $str, 1);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню