PHP:substr和str_replace不像往常一样工作

时间:2018-03-07 06:45:22

标签: php string url

我是从GET参数中获取查询字符串,如下所示:

$queryStr= http_build_query($_GET);

我试图同时应用str_replace和amp;此字符串上的substr用于将get参数的某个原始值替换为所需的值。 两者都没有返回原始字符串。

例如。 $sth = substr($queryStr, 0, 9);

$sth = str_replace ("user", "somethingelse",$queryStr);

这有什么问题?

编辑: 好的,对不起。字符串函数由于我对if条件中的变量的粗心错误而无法正常工作。他们应该工作正常。

顺便说一下, 我通过$_GET["key"] = "sth";

更改$ _GET参数的值后,在http_build_query()函数中发现了另一个错误

其他获取参数数组我甚至没有触及自动从“arrayName%5B%5D”更改为“arrayName%5B0%5D” http_build_query()

生成的新查询
$original_url = http_build_query($_GET);

$_GET["key"] = "sth";

$new_url = http_build_query($_GET);
  

原始查询来自http_build_query():

     

&安培; arrayName中%5B%5D =

     

来自http_build_query()的新查询:

     

&安培; arrayName中%5B的 0 %5D =

这是什么原因?

3 个答案:

答案 0 :(得分:1)

请检查,str_replace正在运行:

链接: http://localhost/test.php?val1=1&val2=2

$ queryStr = http_build_query($ _ GET);

echo "Before " .$queryStr;
$queryStr = str_replace("val1","val2",$queryStr);
echo "<br> After " .$queryStr;

**Output**

Before val1=1&val2=2
After val2=1&val2=2

答案 1 :(得分:1)

在提供的链接https://3v4l.org/8i1sH中,您的代码可以正常运行:

$_GET = ['user' => 'Bob', 'location' => 'city'];
$queryStr = http_build_query($_GET);
echo $queryStr, PHP_EOL;

$sth = str_replace ("user", "somethingelse",$queryStr);
echo $sth, PHP_EOL;
$sth = substr($queryStr, 0, 9);
echo $sth, PHP_EOL;

但更简单的解决方案是在$_GET数组中替换您需要的内容,然后构建查询字符串,例如https://3v4l.org/i6eKv

// remove items, 
unset($_GET['key']);

// add/replace items
$_GET['another_key'] = 'value';

// and only then
$queryStr = http_build_query($_GET);

答案 2 :(得分:1)

我在构建查询字符串之前替换参数。

<?php
$params = 
[
    'song'   => 'Bridge over troubled water',
    'artist' => 'Simon & Garfunkel',
    'tags'   => 'gorgeous;harmony;bridge'
];
$overrides =
[
    'tags'   => 'dirge;tears',
    'artist' => 'Elvis Presley'
];

$params = array_replace($params, $overrides);

$query_string = http_build_query($params);

var_dump($query_string);

输出:

string(71) "song=Bridge+over+troubled+water&artist=Elvis+Presley&tags=dirge%3Btears"