【问题标题】:Encode characters if not already encoded (with rawurlencode and preg_replace_callback)如果尚未编码,则对字符进行编码(使用 rawurlencode 和 preg_replace_callback)
【发布时间】:2017-11-08 22:08:01
【问题描述】:

我想用百分比编码表示 (%xy) 替换字符串中的所有字符,但只替换尚未进行百分比编码的字符。

例如,在字符串 abc#%2Bdef 中,%2B 部分已经是百分比编码的表示形式。所以它不应该被重新编码。编码后正确的结果应该是:abc%23%2Bdef

这是我尝试过的——但结果仍然是abc#%2Bdef

// Pattern: read all characters except the percent-encoded ones (%xy).
$pattern = '/(?!%[a-fA-F0-9]{2})/';
$string = 'abc#%2Bdef';

$result = preg_replace_callback($pattern, function($matches) {
    return rawurlencode($matches[0]);
}, $string);

var_dump($result);

我认为应该更改的只是 $patternvalue,但我不确定。在当前模式下,不会调用回调中的rawurlencode()

编码图例:%23 -> #%2B -> +

我今天试了好几个小时才找到正确的图案形式。一开始看起来很简单......我非常感谢任何建议或解决方案。

非常感谢。

【问题讨论】:

  • 这真的没有意义。如果百分比是字面的,而不是百分比编码的一部分呢?你如何得到一个字符串,它的一部分是 url 编码的,而不是全部?
  • 谢谢你,@Barmar。嗯,你问了我一个很好的问题。给我一点时间考虑一下。
  • @aendeerei 我想你应该可以一直打电话给urlencode()。如果您的代码输入已经被编码,那是因为您试图通过嵌套的 URL 编码字符串。例如,一个 URL 参数可以是另一个 URL,并且该内部 URL 可能包含 URL 编码的参数。它们需要进行双重编码。

标签: php regex url encoding character-encoding


【解决方案1】:

简单的方法是先解码以前编码的字符,然后重新编码所有字符串。

$string = 'abc#%2Bdef';
$string = rawurlencode(rawurldecode($string));

这会给你预期的结果。

abc%23%2Bdef

【讨论】:

  • 非常感谢你,Chin。给我一点时间检查和测试,我一定会回来找你的。
  • @aendeerei 当然:)
  • 我很感激 :-)
  • 下巴,需要的时间比预期的要长。我不认为我今天会设法检查它。明天我可以给你我的反馈吗?谢谢。
  • @aendeerei 是的,当然:)
猜你喜欢
  • 1970-01-01
  • 2015-03-22
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 2012-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多