剪切一个字符串/url,以始终获得包含特定数据的最终字符串/url,并且它';php中的s值

剪切一个字符串/url,以始终获得包含特定数据的最终字符串/url,并且它';php中的s值,php,string,while-loop,Php,String,While Loop,我有一个包含单词“&key”的url。 “&关键字”可以在url的开头或结尾 Ex1= Ex2= 我想得到的是始终包含关键元素及其值的url R1: R2: 以下是我所做的: $lp_sp_ad_publisher = "http://xxxxx.com?c1=xxx&c2=xxx&c3=xxx&key=xxxc4=xxxf1=xxx"; $lp_sp_ad_publisher_cut_link = explode("&", $lp_sp_ad_publisher

我有一个包含单词“&key”的url。 “&关键字”可以在url的开头或结尾

Ex1=

Ex2=

我想得到的是始终包含关键元素及其值的url

R1:

R2:

以下是我所做的:

$lp_sp_ad_publisher = "http://xxxxx.com?c1=xxx&c2=xxx&c3=xxx&key=xxxc4=xxxf1=xxx";
$lp_sp_ad_publisher_cut_link = explode("&", $lp_sp_ad_publisher_cut[1]); // tab
$lp_sp_ad_publisher_cut_link_final = $lp_sp_ad_publisher_cut_link[0]; // http://xxxxx.com?c1=xxx
$counter = 1;
// finding &key inside $lp_sp_ad_publisher_cut_link_final
while ((strpos($lp_sp_ad_publisher_cut_link_final, '&key')) !== false);
{
    $lp_sp_ad_publisher_cut_link_final .= $lp_sp_ad_publisher_cut_link[$counter];
    echo 'counter: ' . $counter . ' link: ' . $lp_sp_ad_publisher_cut_link_final . '<br/>';
    $counter++;
}
$lp\u sp\u ad\u publisher=”http://xxxxx.com?c1=xxx&c2=xxx&c3=xxx&key=xxxc4=xxxf1=xxx";
$lp_sp_ad_publisher_cut_link=explode(&),$lp_sp_ad_publisher_cut[1]);//标签
$lp_sp_ad_publisher_cut_link_final=$lp_sp_ad_publisher_cut_link[0];//http://xxxxx.com?c1=xxx
$counter=1;
//查找并键入$lp\u sp\u广告\u出版商\u剪切\u链接\u最终版本
while((strpos($lp\u sp\u ad\u publisher\u cut\u link\u final,&key'))!==false);
{
$lp_sp_ad_publisher_cut_link_final.=$lp_sp_ad_publisher_cut_link[$counter];
回显“counter:”.$counter.“link:”.$lp\u sp\u ad\u publisher\u cut\u link\u final.“
”; $counter++; }
我一直只循环一次。我猜while循环没有使用内部的新值刷新。有什么解决办法吗?

编辑:对不起,我误解了这个问题

这是一个棘手的问题,因为url键和值可以是任何东西,所以使用and组合分解url可能更安全,然后将url重新组合在一起,去掉不需要的部分。大概是这样的:

function cut_url( $url='', $key='' )
{
    $output = '';
    $parts  = parse_url( $url );
    $query  = array();

    if( isset( $parts['scheme'] ) )
    {
        $output .= $parts['scheme'].'://';
    }
    if( isset( $parts['host'] ) )
    {
        $output .= $parts['host'];
    }
    if( isset( $parts['path'] ) )
    {
        $output .= $parts['path'];
    }
    if( isset( $parts['query'] ) )
    {
        $output .= '?';
        parse_str( $parts['query'], $query );
    }
    foreach( $query as $qkey => $qvalue )
    {
        $output .= $qkey.'='.$qvalue.'&';
        if( $qkey == $key ) break;
    }
    return rtrim( $output, '&' );
}
用法:

$input = 'https://www.xxxxx.com/test/path/index.php?c1=xxx&c2=xxx&key=xxx&c3=xxx&c4=xxx&f1=xxx';
$output = cut_url( $input, 'key' );
输出:

https://www.xxxxx.com/test/path/index.php?c1=xxx&c2=xxx&key=xxx

如果目的是始终确保参数
及其关联值出现在字符串的末尾,那么类似以下内容如何:

$tmp=array();$key='';
$parts=explode( '&', parse_url( $_SERVER['REQUEST_URI'], PHP_URL_QUERY ) );
foreach( $parts as $pair ) {
    list( $param,$value )=explode( '=',$pair );
    if( $param=='key' )$key=$pair;
    else $tmp[]=$pair;
}
$query = implode( '&', array( implode( '&', $tmp ), $key ) );
echo $query;
或者

更新 我对你“没有得到好结果”感到困惑

以url为例:

https://localhost/index.php?sort=0&dir=false&tax=23&cost=99&aardvark=creepy&key=banana&tree=large&ac=dc&limit=1000#569f945674935
上述结果将是:

sort=0&dir=false&tax=23&cost=99&aardvark=creepy&tree=large&ac=dc&limit=1000&key=banana

因此,使用上述任何一种方法,
key=banana
都会放在最后。

这很好,但是,我还需要url的开头。不仅是“key”的值,谢谢你的帮助,我将验证你的答案,而且我使用了一种不同的方法来验证它=)我正在研究你的第一个解决方案。带$parts=爆炸(“&”,”);我没有得到好的结果你真的打算删除键参数后出现的参数吗?或者您只是想确保密钥是最后一个参数?
sort=0&dir=false&tax=23&cost=99&aardvark=creepy&tree=large&ac=dc&limit=1000&key=banana