我想替换可能出现在网址中的字符串。
字符串具有以下模式:
%26TID%3D123456
我想将123456
部分替换为特定值,例如:777777
。
为了安全起见,我不想假设原始字符串的相关部分必须在%3D
部分之后必须有6位数字;我想假设原始字符串可能包含更多或更少的字符(我也无法告诉每个数字的实际值)。
此外,当我替换字符串时,因为该字符串通常会出现在URL的中间,所以我需要替换它而不修改URL的其余部分。在该字符串之后,通常会有另一个%26
字符串,我想保留它,包括它之后的任何内容,但为了安全起见,我不想假设原始字符串是必需的然后是%26
。
做出这样的替换的最佳做法是什么,能够经得起我上述所有条件?
答案 0 :(得分:1)
一般规则是指定边界(或#34;锚点#34;)(此处为起始点),然后根据更通用的模式匹配您想要的任何内容。
这里,"锚"是文字TID%3D
。更通用的模式是一个或多个数字:\d+
。
由于您需要替换第一个匹配项,因此需要在1
中将preg_replace
作为 limit 参数值传递。
所以,结合所有这些:
$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
如果你不想(或不知道)"锚"文本,使用捕获机制(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 approach,但效率较低:
$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);