【问题标题】:How to parse tokens from a known URL format? [closed]如何从已知的 URL 格式解析令牌? [关闭]
【发布时间】:2013-12-25 21:15:39
【问题描述】:

我在 PHP 中有一个字符串,它反映了为网站选择的 URL 路由格式——它根据方案中传递的索引/指令动态构建内容。例如,典型的请求格式可能如下所示:

$str = '/something-new/:id/goto/:new_id/full/page/:num/';

我要提取的数据是每个索引的实体名称,前面总是有一个冒号:。但是,我不确定采取的最佳方法 - "splitting" 字符串似乎很麻烦。将这些结果数据放入数组的最简单方法是什么?

$arr = [
    [0] => 'id', 
    [1] => 'new_id', 
    [2] => 'num'
];

【问题讨论】:

  • 使用explode 创建一个数组,array_filter 保留以: 开头的数组,array_map 删除: 字符。
  • 或者爆炸,然后是一个foreach循环,它将以:开头的元素复制到结果数组中,同时删除:
  • preg_match_all 当然。
  • 我不知道,但我认为 :foo 在 SQL 明智的准备语句中用作命名参数,并且不包含在 actual URL 中。不过,这只是一个猜测。

标签: php arrays regex string


【解决方案1】:
preg_match_all('~:(.*?)/~', $str, $matches);
print_r($matches[1]);

: demo

【讨论】:

【解决方案2】:

只需使用preg_match_all 来匹配: 之后的字母字符,如下所示:

$str = '/something-new/:id/goto/:new_id/full/page/:num/';
preg_match_all("/:[a-zA-Z_]*/", $str, $matches);
echo '<pre>';
print_r($matches[0]);
echo '</pre>';

输出是:

Array
(
    [0] => :id
    [1] => :new_id
    [2] => :num
)

那么只需滚动$matches[0] 即可获得最终数组:

$str = '/something-new/:id/goto/:new_id/full/page/:num/';
preg_match_all("/:[a-zA-Z_]*/", $str, $matches);
if (!empty($matches[0])) {
  $arr = array();
  foreach ($matches[0] as $match_key => $match_value) {
    $arr[] = preg_replace('/:/', '', $match_value);
  }
}
echo '<pre>';
print_r($arr);
echo '</pre>';

所以$arr 的值现在是这样的:

Array
(
    [0] => id
    [1] => new_id
    [2] => num
)

【讨论】:

  • @samitha 注意到。编辑了我的答案以显示创建这样一个数组的整个路径。
【解决方案3】:

我不确定我是否理解正确,但是:

$str = '/something-new/:id/goto/:new_id/full/page/:num/';
$arr = explode('/', $str);
$arr = array_filter($arr, function($element) {
    return strpos($element, ':') === 0;
 });
$arr = array_values($arr);
$arr = array_map(function($element) {
    return substr($element, 1);
}, $arr);

结果:

$arr = array([0] => 'id', [1] => 'new_id', [2] => 'num');

【讨论】:

    【解决方案4】:

    我会使用带有命名模式的正则表达式,例如:

    ~^/something-new/(?<id>[^/]+)/goto/(?<new_id>[^/]+)/full/page/(?<num>.*)$~
    

    preg_match

    示例

    <?php
      $url = '/something-new/123/goto/321/full/page/1337';
    
      if (preg_match('~^/something-new/(?<id>[^/]+)/goto/(?<new_id>[^/]+)/full/page/(?<num>.*)$~', $url, $match)) {
        var_dump( $match['id'] , $match['new_id'] , $match['num'] );
      }
    ?>
    

    输出

    string(3) "123"
    string(3) "321"
    string(4) "1337"
    

    DEMO

    编辑

    根据我的评论,确保您知道如果 URL 中有实际冒号,这将调用它们 :123:321 等;

    我不知道,但我认为 :foo 在准备好的 SQL 语句中被用作命名参数,并且不包含在实际 URL 中。不过,这只是一个猜测。

    【讨论】:

    • 谢谢,很好的回答
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-09
    • 2012-08-13
    相关资源
    最近更新 更多