我将查询字符串设为q=pen&fq[category]=Pens & Refills&fq[category_id]=34
,如何仅将&
替换为此%26
中的Pens & Refills
,而不是所有&
。请有人帮我用正则表达式模式做到这一点。
答案 0 :(得分:2)
如果由于某种原因确实需要替换该字符,则可以在不使用正则表达式的情况下执行此操作。
$string = str_replace(' & ', ' %26 ', $string);
答案 1 :(得分:1)
像这样:
$regex = "~[ ]\K&~";
$replaced = preg_replace($regex,"%26",$string);
在demo中,请参阅底部的替换。
<强>解释强>
[ ]
匹配一个空格。你不需要括号,但这样更容易阅读。\K
告诉引擎放弃到目前为止匹配的整体匹配&
匹配我们的角色,我们知道它是正确的角色,因为它前面有一个空格。 %26
不支持的语言选项2 \K
我们可以使用lookbehind:
(?<=[ ])&
选项3适用于既不支持\K
也不支持背后隐藏的语言
我们会使用一个捕获组并在lambda中替换第1组:
[ ](&)
答案 2 :(得分:1)
你可以使用积极的lookbehind,
$regex = "~(?<=Pens ).~";
$replaced = preg_replace($regex,"%26",$string);
您的代码将是,
<?php
$string = 'q=pen&fq[category]=Pens & Refills&fq[category_id]=34';
$regex = "~(?<=Pens ).~";
$replaced = preg_replace($regex,"%26",$string);
echo $replaced;
?>
更新
您似乎想要替换前后有空格的&
符号。
<?php
$string = 'q=pen&fq[category]=Pens & Refills&fq[category_id]=34';
$regex = "~ & ~";
$replaced = preg_replace($regex," %26 ",$string);
echo $replaced;
?> //=> q=pen&fq[category]=Pens %26 Refills&fq[category_id]=34