将&符号(&)替换为查询字符串中的%26

时间:2014-06-24 04:19:16

标签: php regex url

我将查询字符串设为q=pen&fq[category]=Pens & Refills&fq[category_id]=34,如何仅将&替换为此%26中的Pens & Refills,而不是所有&。请有人帮我用正则表达式模式做到这一点。

3 个答案:

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

DEMO

您的代码将是,

<?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