以下是我在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。如果你看看他们奇怪的例子。]
答案 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 string和urlencode,例如:
$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