【问题标题】:How can I get parameters from a URL string?如何从 URL 字符串中获取参数?
【发布时间】:2012-07-13 21:51:39
【问题描述】:

我有一个 HTML 表单字段 $_POST["url"],其中包含一些 URL 字符串作为值。

示例值为:

https://example.com/test/1234?email=xyz@test.com https://example.com/test/1234?basic=2&email=xyz2@test.com https://example.com/test/1234?email=xyz3@test.com https://example.com/test/1234?email=xyz4@test.com&testin=123 https://example.com/test/the-page-here/1234?someurl=key&email=xyz5@test.com

等等

如何才能从这些 URL/值中仅获取 email 参数?

请注意,我没有从浏览器地址栏中获取这些字符串。

【问题讨论】:

标签: php url-parsing


【解决方案1】:

您可以为此使用parse_url() 和parse_str()。

$parts = parse_url($url);
parse_str($parts['query'], $query);
echo $query['email'];

如果你想用 PHP 动态获取$url,看看这个问题:

Get the full URL in PHP

【讨论】:

  • 它的工作,但我在这样的日志中收到错误:PHP 注意:未定义的索引:查询
  • 此外,如果它是查询中的最后一个字符,您将有一个问号。我用这个:if (strpos($urlParts['path'], '?')) { $urlParts['path'] = substr($urlParts['path'], 0, strpos($urlParts['path'], '?')); } 将其从末尾删除。
【解决方案2】:

? 之后的所有参数都可以使用$_GET 数组来访问。所以,

echo $_GET['email'];

将从网址中提取电子邮件。

【讨论】:

  • 这不是问题的答案,但这是我向 Google 询问问题时一直在寻找的答案,因此 +1 表示正确回答 Google。
  • 这可能不是问题的答案,但却是获取 URL 参数的正确和最简单的方法——如果它们设置正确:https://example.com?email=myemail@example.com$email = $_GET['email']; $email === 'myemail@example.com';
【解决方案3】:

使用parse_url() 和parse_str() 方法。 parse_url() 将一个 URL 字符串解析成一个关联数组。由于您只需要 URL 的单个部分,因此您可以使用快捷方式返回包含所需部分的字符串值。接下来,parse_str() 将为查询字符串中的每个参数创建变量。我不喜欢污染当前上下文,所以提供第二个参数会将所有变量放入关联数组中。

$url = "https://mysite.com/test/1234?email=xyz4@test.com&testin=123";
$query_str = parse_url($url, PHP_URL_QUERY);
parse_str($query_str, $query_params);
print_r($query_params);

//Output: Array ( [email] => xyz4@test.com [testin] => 123 ) 

【讨论】:

    【解决方案4】:

    正如另一个答案中提到的,最好的解决方案是使用parse_url()。

    您需要使用parse_url() 和parse_str() 的组合。

    parse_url() 解析 URL 并返回其组件,您可以使用 query 键获取查询字符串。然后您应该使用解析查询字符串并返回的parse_str() 值到变量中。

    $url = "https://example.com/test/1234?basic=2&email=xyz2@test.com";
    parse_str(parse_url($url)['query'], $params);
    echo $params['email']; // xyz2@test.com
    

    您也可以使用 regex 来完成这项工作:preg_match()

    您可以使用preg_match() 从 URL 中获取查询字符串的特定值。

    preg_match("/&?email=([^&]+)/", $url, $matches);
    echo $matches[1]; // xyz2@test.com
    

    preg_replace()

    您也可以使用preg_replace()一行来完成这项工作!

    $email = preg_replace("/^https?:\/\/.*\?.*email=([^&]+).*$/", "$1", $url);
    // xyz2@test.com
    

    【讨论】:

    • 我正在使用 Laravel。 preg_replace() 方法在这里效果最好,因为它不会在 URL 中未定义 query 时引发错误,这与 parse_url() 不同,而且它是单行的!
    【解决方案5】:

    使用$_GET['email'] 作为 URL 中的参数。 使用$_POST['email'] 将数据发布到脚本。 或者两者都使用_$REQUEST。 此外,如前所述,您可以使用返回 URL 的所有部分的 parse_url() 函数。使用名为“查询”的部分 - 在那里您可以找到您的电子邮件参数。更多信息:http://php.net/manual/en/function.parse-url.php

    【讨论】:

    • OP 说他没有从 address bar 获取 URL。这些 URL 只是字符串 IN 代码。
    【解决方案6】:

    您可以使用以下代码获取网址中? 后面的电子邮件地址:

    <?php
    if (isset($_GET['email'])) {
        echo $_GET['email'];
    }

    【讨论】:

    • OP 请求从字符串而不是当前页面中的 URL 中提取变量。 parse_url() 是假设字符串格式正确的正确答案。
    【解决方案7】:

    我创建了一个函数from Ruel's answer。

    你可以用这个:

    function get_valueFromStringUrl($url , $parameter_name)
    {
        $parts = parse_url($url);
        if(isset($parts['query']))
        {
            parse_str($parts['query'], $query);
            if(isset($query[$parameter_name]))
            {
                return $query[$parameter_name];
            }
            else
            {
                return null;
            }
        }
        else
        {
            return null;
        }
    }
    

    例子:

    $url = "https://example.com/test/the-page-here/1234?someurl=key&email=xyz5@test.com";
    echo get_valueFromStringUrl($url , "email");
    

    感谢@Ruel。

    【讨论】:

      【解决方案8】:

      这里还没有提到我很惊讶的更安全的答案:

      filter_input

      因此,在问题的情况下,您可以使用它从 URL 获取参数中获取电子邮件值:

      $email = filter_input( INPUT_GET, 'email', FILTER_SANITIZE_EMAIL );

      对于其他类型的变量,您可能需要choose a different/appropriate filter,例如FILTER_SANITIZE_STRING。

      我想这个答案不仅仅是问题所要求的——从 URL 参数中获取原始数据。但这是一个单行快捷方式,结果与此相同:

      $email = $_GET['email'];
      $email = filter_var( $email, FILTER_SANITIZE_EMAIL );
      

      不妨养成这样抓取变量的习惯。

      【讨论】:

      • 哎呀,没有看到关于未从 URL 获取此内容的问题的最后一行...仍将其留在这里以防对任何人有帮助。
      【解决方案9】:
      $uri = $_SERVER["REQUEST_URI"];
      $uriArray = explode('/', $uri);
      $page_url = $uriArray[1];
      $page_url2 = $uriArray[2];
      echo $page_url; <- See the value
      

      这对我使用 PHP 非常有用。

      【讨论】:

      • 您能否尝试详细说明答案。上面的答案很难理解你的意思。
      【解决方案10】:
      $web_url = 'http://www.writephponline.com?name=shubham&email=singh@gmail.com';
      $query = parse_url($web_url, PHP_URL_QUERY);
      parse_str($query, $queryArray);
      
      echo "Name: " . $queryArray['name'];  // Result: shubham
      echo "EMail: " . $queryArray['email']; // Result:singh@gmail.com
      

      【讨论】:

      • 解释一下。例如,想法/要点是什么?请通过editing (changing) your answer 回复,而不是在 cmets 中(without "Edit:"、"Update:" 或类似的 - 答案应该看起来像是今天写的)。
      【解决方案11】:

      在Laravel,我正在使用:

      private function getValueFromString(string $string, string $key)
      {
          parse_str(parse_url($string, PHP_URL_QUERY), $result);
      
          return isset($result[$key]) ? $result[$key] : null;
      }
      

      【讨论】:

        【解决方案12】:

        解析字符串 URL 并获取 URL 中传递的查询参数的值的动态函数:

        function getParamFromUrl($url, $paramName){
          parse_str(parse_url($url, PHP_URL_QUERY), $op); // Fetch query parameters from a string and convert to an associative array
          return array_key_exists($paramName, $op) ? $op[$paramName] : "Not Found"; // Check if the key exists in this array
        }
        

        调用函数得到结果:

        echo getParamFromUrl('https://google.co.in?name=james&surname=bond', 'surname'); // "bond" will be output here
        

        【讨论】:

          【解决方案13】:

          为了从 URL 字符串中获取参数,我使用了以下函数。

          var getUrlParameter = function getUrlParameter(sParam) {
              var sPageURL = decodeURIComponent(window.location.search.substring(1)),
                  sURLVariables = sPageURL.split('&'),
                  sParameterName,
                  i;
          
              for (i = 0; i < sURLVariables.length; i++) {
                  sParameterName = sURLVariables[i].split('=');
          
                  if (sParameterName[0] === sParam) {
                      return sParameterName[1] === undefined ? true : sParameterName[1];
                  }
              }
          };
          var email = getUrlParameter('email');
          

          如果有很多 URL 字符串,那么您可以使用循环从所有这些 URL 字符串中获取参数 'email' 并将它们存储在数组中。

          【讨论】:

          • 我没有从浏览器地址栏中获取这些字符串,但您发布了解决方案
          • OP 询问的是 PHP,而不是 JavaScript
          猜你喜欢
          • 2011-05-08
          • 2016-12-03
          • 1970-01-01
          • 1970-01-01
          • 2020-11-28
          • 2010-10-14
          相关资源
          最近更新 更多