【问题标题】:How do you loop through a string in php and replace '%' characters that are ONLY followed by another '%' character?如何在 php 中循环遍历字符串并替换仅后跟另一个 '%' 字符的 '%' 字符?
【发布时间】:2011-02-27 21:08:19
【问题描述】:

这是我想要在 PHP 中实现的目标:

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

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

我应该怎么做?正则表达式?如果是这样,你有一个例子吗?或遍历字符串中的每个字符并替换?我正在考虑为此使用 str_pos 但它可能在一次替换后,字符串中的位置会改变:(

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

【问题讨论】:

  • 虽然像 s/%(?![0-9a-f]+)/%25/ig; 这样的东西可以解决 % 转义问题,但要构造方法来验证该 google api 链接中的规范化实现,还有很长的路要走。
  • 我现在明白了罪,例子从一个到另一个变得可怕。大多数时候你需要递归!不管怎样,我会解决它,也许会在 GPL 许可下发布一个 php 类,所以下一个人不必为此挠头 2 天。例如:- host/%2525252525252525 => host/%25 (加入下一个“25”的 %25="%" 成为另一个 %25 并递归地继续)小心并感谢您的反馈!
  • 没问题,祝你好运。 s/%(?:25){2,}/%25/g

标签: php regex url loops


【解决方案1】:

使用preg_replace:

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

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

结果是:

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

EDIT 错过了最后一个%的案例,见:

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

因此,前瞻断言检查下一个字符是否有另一个% 行尾。

【讨论】:

  • 感谢 Hamish 的回复。从正则表达式来看,它看起来可以很好地工作,但它跳过了 25。输出应该是 host/%25%25%25asd%25%25
【解决方案2】:

simple string(非正则表达式)将 '%%' 替换为 '%25%25' 怎么样?

这是假设您确实希望输出是您提到的 host/%25%25%25asd%25%25 而不是 one %25 最后。

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

使用urlencodeurldecode方法,例如:

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

【讨论】:

  • 感谢您的回复。是的,我想到了,但问题是,如果我想将诸如“host/%%25asd%%”之类的转换为 host/%25%2525asd%25%25 而不是 host/ %25%25asd%25%25。明白了吗?
  • 如果您想考虑所有可能的组合 preg_replace 与前瞻是要走的路,再加上手动进行培训。或者查看我上面添加的其他方法。
  • 我尝试使用它,但后来我从 google 的示例中意识到,有时我会递归/嵌套,因此使用 urldecode 没有意义。但感谢您花时间为我找到解决方案。保重!
【解决方案3】:

使用 str_replaceenter link description here 而不是 preg_replace ,它更容易应用和清理

【讨论】:

    【解决方案4】:

    这样的事情怎么样?

    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

    【讨论】:

      猜你喜欢
      • 2015-01-17
      • 2016-01-24
      • 1970-01-01
      • 1970-01-01
      • 2014-02-12
      • 1970-01-01
      • 2018-10-19
      • 2019-10-31
      • 1970-01-01
      相关资源
      最近更新 更多