如何在php中循环一个字符串并替换“%”字符,这些字符后面只跟有另一个“%”字符?

如何在php中循环一个字符串并替换“%”字符,这些字符后面只跟有另一个“%”字符?,php,regex,url,loops,Php,Regex,Url,Loops,以下是我试图用PHP实现的目标: 我有这个字符串:host/%%%25asd%% 现在我想循环遍历它,并用%25只替换%\u个空白字符。所以我得到的输出是主机/%25%25%25asd%25%25。%25未被触及,因为%后面没有另一个% 我该怎么做呢?正则表达式?如果有,你有没有一个例子?还是遍历字符串中的每个字符并替换?我曾考虑使用str_pos进行此操作,但更换一次后,字符串中的位置可能会发生变化: [编辑:让我再添加一些信息以缓解混淆。%25只是一个示例,它可以是%30或%0a,我现在还不

以下是我试图用PHP实现的目标:

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

现在我想循环遍历它,并用%25只替换%\u个空白字符。所以我得到的输出是主机/%25%25%25asd%25%25。%25未被触及,因为%后面没有另一个%

我该怎么做呢?正则表达式?如果有,你有没有一个例子?还是遍历字符串中的每个字符并替换?我曾考虑使用str_pos进行此操作,但更换一次后,字符串中的位置可能会发生变化:

[编辑:让我再添加一些信息以缓解混淆。%25只是一个示例,它可以是%30或%0a,我现在还不知道。字符串也可以是host/%%25asd%%,所以简单地替换为%%screw-up-as-host/%2525asd%25,而不是host/%25%25asd%25。我试图实现的是将url解析为how-google希望将其用于他们的websafe api。如果您看到他们奇怪的示例。]

请使用:

请注意lookahead断言。这将匹配后跟%的每一个%,并将其替换为%25

结果是:

host/%25%25%25asd%25%
编辑最后%的案例,请参见:

因此,lookahead断言将检查下一个字符中是否有另一个%或行尾。

使用:

请注意lookahead断言。这将匹配后跟%的每一个%,并将其替换为%25

结果是:

host/%25%25%25asd%25%
编辑最后%的案例,请参见:

因此,lookahead断言检查下一个字符是否有另一个%或行的结尾。

用“%25%25”替换“%”的非正则表达式如何

这是假设您确实希望输出是您提到的主机/%25%25%25asd%25%25,而不是最后的一个%25

编辑:这是另一种可能适用于您的情况的方法:

使用方法和步骤,例如:

将“%”的非正则表达式替换为“%25%25”怎么样

这是假设您确实希望输出是您提到的主机/%25%25%25asd%25%25,而不是最后的一个%25

编辑:这是另一种可能适用于您的情况的方法:

使用方法和步骤,例如:


使用str_replace而不是preg_replace,它更容易应用和清洁

使用str_replace而不是preg_replace,它更容易应用和清洁

类似的东西怎么样

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


主机/%25%25%25asd%25%25

像这样的怎么样

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


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

谢谢你的回复。是的,我想到了,但问题是如果我想转换一个,比如host/%25asd%%,那么它会把它弄乱成host/%25%2525asd%25%25,而不是host/%25%25asd%25%25。明白了吗?如果你想考虑所有可能的组合,用lookaheads替换是一种方法,再加上手动训练%。或者查看我上面添加的其他方法。我尝试过使用它,但后来从google的示例中我意识到,有时我会使用递归/嵌套,因此使用urldecode没有意义。但感谢您花时间尝试为我找到解决方案。保重!感谢您的回复。是的,我想到了,但问题是如果我ant要转换一个像host/%%25asd%%这样的组合,那么它会把它弄乱成host/%25%2525asd%25%25,而不是host/%25%25asd%25%25。明白了吗?如果你想考虑所有可能的组合,用lookaheads替换是一个好办法,再加上手工进行%的培训。或者看看我上面添加的另一种方法。我尝试过使用它,但后来我从谷歌上意识到了这一点的示例中,有时我会使用递归/嵌套,因此使用urldecode没有意义。但感谢您花时间为我找到解决方案。小心!感谢Hamish的回复。从正则表达式来看,它看起来工作得很好,但跳过了25。输出应该是host/%25%25%25asd%25%25感谢Hamish的回复。从正则表达式来看,它似乎工作得很好,但它跳过了25。输出应该是host/%25%25%25asd%25%25,尽管类似于s/%?![0-9a-f]+/%25/ig;将解决%转义问题,要构造方法来验证google api链接中的规范化实现,还有很长的路要走。我现在明白了,从一个例子到另一个例子都很糟糕。大多数时候,你需要递归!我会解决这个问题,也许会发布一个php类获取GPL许可证,这样下一个人在2天内就不必为它挠头了。例如:-=>加入下一个25并成为另一个%25的%25=%on和on递归小心并感谢您的反馈!!没问题,祝您好运。s/%?:25{2,}/%25/gal尽管类似于s/%?![0-9a-f]+/%25/ig;将解决%转义问题,要构造方法来验证google api链接中的规范化实现,还有很长的路要走 例子从一个到另一个都很可怕。大多数时候,你需要去递归!不管怎样,我都会解决这个问题,也许会在GPL许可下发布一个php类,这样下一个人就不必为此费劲两天了。例如:-=>加入下一个25并成为另一个%25的%25=%on递归地小心并感谢您的反馈!!没问题,祝你好运。s/%?:25{2,}/%25/g
$string = preg_replace('/%(?=(%|$))/', '%25', $string);
$string = urlencode(urldecode("host/%%%25asd%%"));
$str = 'host/%%%25asd%%';
$str =~ s/ % (?![0-9a-f]+) /%25/xig;
print $str."\n";