Я хочу заменить строку, которая может отображаться в URL-адресе.
Строка имеет следующий шаблон:
%26TID%3D123456
Я хочу заменить часть 123456
на определенное значение, например: 777777
.
Однако, чтобы быть в безопасности, я не хочу предполагать, что соответствующая часть исходной строки обязательно имеет 6 цифр после %3D
части; Я хочу предположить, что исходная строка может содержать несколько или несколько меньших символов (и я также не могу определить реальное значение каждой цифры).
Кроме того, когда я заменяю строку, поскольку эта строка обычно появляется в середине URL-адреса, мне нужно заменить ее, не изменяя остальную часть URL-адреса. После этой строки обычно будет другая строка %26
которую я хочу сохранить, включая все, что после нее, но чтобы быть в безопасности, я не хочу предполагать, что исходной строке обязательно следует %26
.
Какова наилучшая практика для такой замены, которая будет соответствовать всем моим вышеперечисленным условиям?
Общее правило заключается в том, чтобы указать границу (или "привязку") (здесь, начальную), а затем сопоставить все, что вы хотите, с более общим шаблоном.
Здесь "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
Если вы не хотите (или не знаете) "якорный" текст, используйте механизм захвата (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);
%26
- это&
а%3D
-=
. Поэтому вам, вероятно, следует проанализировать строку, получить и изменить ключи или значения, которые необходимо изменить, и снова закодировать ее.