你如何在php中循环一个字符串并替换只有另一个'%'字符的'%'字符?

时间:2011-02-27 21:08:20

标签: php regex url loops

以下是我在PHP中尝试实现的目标:

我有这个字符串:host / %%% 25asd %%

现在我想循环遍历它并仅用%25替换%_blank字符。所以我得到的输出为主机/%25%25%25asd%25%25。 (%25未受影响,因为%没有跟随另一个%)

我应该怎么做呢?正则表达式?如果有,你有一个例子吗?或循环遍历字符串中的每个字符并替换?我正在考虑使用str_pos,但是在一次替换之后,字符串中的位置会发生变化:(

[编辑:让我添加更多信息以缓解混乱。 %25只是一个例子,它可能是%30或%0a,我不会事先知道。此外,字符串也可以是host / %% 25asd %%,因此%%的简单替换将其作为主机/%2525asd%25而不是主机/%25%25asd%25。我想要实现的是解析一个URL如何谷歌想要它的websafe api。 http://code.google.com/apis/safebrowsing/developers_guide_v2.html#Canonicalization。如果你看看他们奇怪的例子。]

4 个答案:

答案 0 :(得分:3)

使用preg_replace

$string = preg_replace('/%(?=%)/', '%25', $string);

注意前瞻断言。这匹配%之后的每个%,并将其替换为%25

结果是:

host/%25%25%25asd%25%

编辑错过了最后一次%的案例,请参阅:

$string = preg_replace('/%(?=(%|$))/', '%25', $string);

因此,前瞻断言会检查另一个% 行的结尾的下一个字符。

答案 1 :(得分:3)

'{25} 25'将'{3}}(非正则表达式)替换'%%'怎么样?

这假设您确实希望输出为主机/%25%25%25asd%25%25,如您所述,而不是一个%25。

编辑:这是另一种可能适合您的方法:

使用方法simple stringurlencode,例如:

$string = urlencode(urldecode("host/%%%25asd%%"));

答案 2 :(得分:0)

使用str_replace enter link description here代替preg_replace,它更容易应用和清理

答案 3 :(得分:0)

这样的事情怎么样?

s/%(?![0-9a-f]+)/%25/ig;

$str = 'host/%%%25asd%%';
$str =~ s/ % (?![0-9a-f]+) /%25/xig;
print $str."\n";

host/%25%25%25asd%25%25