如何更换未知字符串? (只有模式已知)

时间:2015-12-30 22:03:44

标签: php regex string

我想替换可能出现在网址中的字符串。

字符串具有以下模式:

%26TID%3D123456

  1. 我想将123456部分替换为特定值,例如:777777

  2. 为了安全起见,我不想假设原始字符串的相关部分必须在%3D部分之后必须有6位数字;我想假设原始字符串可能包含更多或更少的字符(我也无法告诉每个数字的实际值)。

  3. 此外,当我替换字符串时,因为该字符串通常会出现在URL的中间,所以我需要替换它而不修改URL的其余部分。在该字符串之后,通常会有另一个%26字符串,我想保留它,包括它之后的任何内容,但为了安全起见,我不想假设原始字符串是必需的然后是%26

  4. 做出这样的替换的最佳做法是什么,能够经得起我上述所有条件?

1 个答案:

答案 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);