【问题标题】:Elegant solution to read and transform query string in php?在 php 中读取和转换查询字符串的优雅解决方案?
【发布时间】:2010-02-09 00:34:08
【问题描述】:

我有一个这样的查询字符串:

file.php?search=keyword+here&genre1=1&genre4=1&genre19=1&genre181&director=436&actor=347&search_rating=3

我需要提取字符串中提到的所有流派,在本例中是它的

genre1, genre4, genre19 and genre18

并将它们输出成一个字符串,例如

ge1_ge4_ge19_ge18

对此有什么好的解决方案?

【问题讨论】:

    标签: php query-string


    【解决方案1】:

    如果您希望通过查询字符串将参数传递给当前正在执行的脚本,那么您只需要:

    $genres = preg_grep('!^genre!', array_keys($_GET));
    $out = implode('_', $genres);
    

    在这里,您使用preg_grep() 过滤掉所有以genre 开头的参数,并使用array_keys() 获取参数名称列表。

    如果你有一个需要解析的 URL,那么使用这个 sn-p:

    $url = 'file.php?search=keyword+here&genre1=1&genre4=1&genre19=1&genre181&director=436&actor=347&search_rating=3';
    $query = parse_url($url, PHP_URL_QUERY);
    parse_str($query, $params);
    $genres = preg_grep('!^genre!', array_keys($params));
    echo implode('_', $genres);
    

    这里的区别是你使用parse_url()提取查询字符串,parse_str()解析查询字符串。

    输出:

    genre1_genre4_genre19_genre181
    

    【讨论】:

    • CPU 密集程度如何? preg 有点慢,不是吗?
    • 如果不循环使用数千次,完全,完全无害。
    • +1 获得不错的、可立即运行的解决方案。只是缺少对 ge_xxx 的转换,但 OP 尚未定义。
    • @Yegor:preg_grep() 很方便。您可以在不使用循环并检查数组键以什么开头的情况下执行此操作,但除非您在单个脚本执行中执行此操作数万次,否则根本不值得担心。
    【解决方案2】:

    parse_str() 带有可选的$arr 参数是专门为正确分解查询字符串而构建的:

    解析 str 就好像它是通过 URL 传递的查询字符串并在当前范围内设置变量。

    它甚至可以处理数组参数。

    http_build_query() 可以将数组与自定义的$arg_separator 重新粘合在一起,但是要根据需要获得特定的输出,您必须手动遍历参数以进行转换。

    【讨论】:

      【解决方案3】:

      您可以在“=”上爆炸,然后在“_”上加入。

      【讨论】:

        猜你喜欢
        • 2015-10-12
        • 2023-03-19
        • 2011-02-13
        • 1970-01-01
        • 1970-01-01
        • 2011-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多