【问题标题】:Get part of URL after ~获取部分 URL ~
【发布时间】:2012-06-30 15:29:59
【问题描述】:

例如,我的网址是http://example.tld/~2g。我想在~(这里是2g)之后获取数据。

我该怎么做?我试过了

$visitlink = explode("~", $_SERVER['REQUEST_URI']);

但这不起作用。

【问题讨论】:

  • $_SERVER['REQUEST_URI'] 能得到什么?
  • explode 的结果是一个数组,你需要从那里得到正确的元素。

标签: php uri


【解决方案1】:

我会用这个:

$visitlink = explode("~",$_SERVER['REQUEST_URI'],2);
$aftertilde = $visitlink[1];

【讨论】:

  • 是的,这项工作会尽快标记为答案(至少在提出问题 15 分钟后作为 stackoverflow 规则)。这正是我想要的。
  • 由于REQUEST_URI 是用户提供的,您可能需要提供默认值以防没有~stackoverflow.com/a/11277659/367456
  • 这不是问题,这是另一个函数的一部分。
【解决方案2】:

list($before, $after) = explode("~", $_SERVER['REQUEST_URI'], 2);

这应该可行。我不确定列表功能是否已被弃用。

【讨论】:

  • list() 不是函数,它是一种语言结构:php.net/manual/en/function.list.php
  • 感谢您的评论。我一直注意到list 的工作方式与大多数函数符号略有不同。在等号左侧的参数中分配值有点奇怪。感谢您的提示。
  • 没问题,如果有可能对变量应用反射,list() 也可能是一个函数。由于变量不知道它们的名字,所以这是不可能的。
【解决方案3】:

要充分利用explode 函数,告诉PHP 只在第一个~ 处拆分(通过告诉2)。 list 构造有助于直接分配返回值(Demo):

list(, $visitlink) = explode("~", $_SERVER['REQUEST_URI'], 2);

如果您不确定该值是否存在,您可能需要提供一个默认值:

list(, $visitlink) = explode("~", $_SERVER['REQUEST_URI'], 2) + array(1 => NULL); 
                                                              ^^^^^^^^^^^^^^^^^^^

这利用了array union operator

或者:这里有一个简单的模式,取第一个 ~ 之后的所有内容:

sscanf($_SERVER['REQUEST_URI'], "%*[^~]~%s", $data);

这个例子使用了sscanf函数,适用于简单的字符串搜索/模式,结果在这里赋值给$data变量。 Demo.

【讨论】:

    【解决方案4】:
    $visitlink = preg_replace('/^[^~]+~(.*)$/', '$1', $_SERVER['REQUEST_URI']);
    

    RegEx 的^[^~]+~ 部分将匹配所有内容,直到遇到~(.*) 将匹配波浪号之后的所有内容。 $1 用于反向引用 (.*) 匹配的内容。

    【讨论】:

    • 还捕获~,这不是要求的结果;)
    • 它不会捕获 ~,因为它会用波浪号之后的内容替换所有内容。 :)
    • 不,它会替换所有内容,但不包括 ~
    • 在重新阅读时你是对的,我想我已经把第二个 ~ 放在那里了 :) 感谢您的编辑 :)
    猜你喜欢
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 2011-10-22
    • 2011-12-15
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多