替换 PHP 中特定 URL 参数的值

Replace value of specific URL param in PHP

我有一个 Facebook link 字符串:

"https://www.facebook.com/v2.5/dialog/oauth?client_id=*****&state=*****&response_type=code&sdk=php-sdk-5.1.2&redirect_uri=http%3A%2F%2Flocalhost%3A8888%2Ffacebook%2Flink&scope=email%2Cuser_birthday%2Cuser_photos"

我要替换:

redirect_uri=http%3A%2F%2Flocalhost%3A8888

redirect_uri=http%3A%2F%2Flocalhost


如果是浏览器,我会这样做 URL,但它是锚标记内的字符串。

if (isset($_GET['redirect_uri'])) {
    echo $_GET['redirect_uri'];
}else{
    // Fallback behaviour goes here
}

我该怎么做?


我试过了

$permissions = 'user_birthday,user_photos';
$login_url = $fb->getLoginUrl(['email','scope'=>$permissions]);
$urls = explode("&", $login_url);
$redirect_uri = explode("=", $urls[4]);
$link = explode("%2F", $redirect_uri[1]);

dd($link);

// array:5 [▼
//   0 => "http%3A"
//   1 => ""
//   2 => "localhost%3A8888" // I want to replace this string with 'localhost'
//   3 => "facebook"
//   4 => "link"
// ]

如果您的字符串实际上是 redirect_uri=http%3A%2F%2Flocalhost%3A8888 则执行此操作:

$url = $_GET['redirect_uri'];
$url = str_replace('redirect_uri=http%3A%2F%2Flocalhost%3A8888', 'redirect_uri=http%3A%2F%2Flocalhost', $url);

这将搜索字符串并进行所需的更改,然后将其保存回 $url 变量。

显然,您可以使用 $_GET['redirect_uri'],无论哪种方式,您都应该清理输入:

Filter Input

Filters - Sanitise

另请参阅:http://php.net/manual/en/function.str-replace.php

也许一些正则表达式替代?

$url = 'https://www.facebook.com/v2.5/dialog/oauth?client_id=*****&state=*****&response_type=code&sdk=php-sdk-5.1.2&redirect_uri=http%3A%2F%2Flocalhost%3A8888%2Ffacebook%2Flink&scope=email%2Cuser_birthday%2Cuser_photos';

$pattern = '/redirect_uri=http\%3A\%2F\%2F[\%0-9A-Za-z]+facebook/';
$replace = 'redirect_uri=http%3A%2F%2Flocalhost%2Ffacebook';
$newURl = preg_replace($pattern, $replace, $url);

考虑这个输入字符串:

https://www.facebook.com/v2.5/dialog/oauth?client_id=*****&state=*****&response_type=code&sdk=php-sdk-5.1.2&redirect_uri=http%3A%2F%2Flocalhost%3A8888%2Ffacebook%2Flink&scope=email%2Cuser_birthday%2Cuser_photos

您可以使用带有空替换字符串的灵活正则表达式模式:

/&redirect_uri=\S+?localhost\K%[^%]+/

Replacement Demo Link

这个模式(简单来说)说:

  • 匹配“&redirect_uri=”
  • 匹配任何非白色字符一次或多次(尽快停止)
  • 匹配"localhost"
  • 重新启动 "full string match" (\K)
  • 匹配“%”
  • 匹配一个或多个非 % 字符