正则表达式能解决这个问题吗?

时间:2009-07-30 04:53:56

标签: php regex

页面: /index.php?page=6&test=1&test2=2

以下代码 page = 6 下面的代码,因此我可以将新页面添加到网址并再次将$ url_without_page_var添加回我们的链接:

$_SERVER['argv'][0]
// Displays:   page=6&test=1&test2=2

 $url_without_page_var=preg_replace('/page=(\d+)/i','',$_SERVER['argv'][0]);
// Displays: &test=1&test2=2

好的,以便代码让我从 page = 6& test = 1& test2 = 2 中取出 page = 6 然后我可以更改页码并将它们全部重新组合在一起。

我的问题往往是网址中的网页并不总是处于同一位置,可能不是第1个或最后一个项目 这就是当发生URL现在不正确时会发生的事情;

/page.php?& ** test = 1& test2 = 2 ** ERROR-HERE-ALSO page = 9

可以解决这个问题吗?

6 个答案:

答案 0 :(得分:5)

$_GET变量提供通过URL设置的所有变量的数组。 $_REQUEST是所有GETPOST变量集的数组。这是鱼:

$url_string = "index.php?";
foreach( $_GET as $k => $v ){
    if( $k != "key_you_dont_want"){ // <-- the key you don't want, ie "page"
        if( $url_string != "index.php?" )
            $url_string .= "&"; // Prepend ampersands nicely
        $url_string .= $k . "=" . $v;
    }
}

正则表达式对这个问题有点矫枉过正。 希望它有意义。过去几周我一直在编写Python和Javascript。 PHP感觉就像倒退了一步。

编辑:这段代码让我更开心。我实际上测试过它而不是盲目地打字和交叉手指。

unset( $_GET["page"] );

$c = count($_GET);
$amp = "";
$url_string = "test.php";

if( $c > 0 ) {
    $url_string .= "?";
    foreach( $_GET as $k => $v ){
        $url_string .= $amp . $k . "=" . $v;
        $amp = "&";
    }
}

答案 1 :(得分:4)

为什么你不能重建网址?

 $query = $_GET;
 unset($query['page']);
 $length = ($length = strpos($_SERVER['REQUEST_URI'], '?')) ? $length : strlen($_SERVER['REQUEST_URI']); 
 $url = substr($_SERVER['REQUEST_URI'], 0, $length) . '?' . http_build_query($query);

http_build_query()确实需要PHP5,但您可以轻松地重写该功能。

编辑:添加$ length变量来修复代码。

答案 2 :(得分:2)

修改你的正则表达式以寻找一个可选的尾随&符号并删除它。然后,当您将URL重新放在一起时,请在必要时添加一个&符号。

$url_without_page_var=preg_replace('/page=(\d+)\&?/i','',$_SERVER['argv'][0]);
$new_url = $url_without_page_var . '&page=9';

答案 3 :(得分:1)

您可能需要查看parse_str,从查询字符串中提取信息并将其作为数组获取

然后你可以

  • 例如,使用unset从数组中删除page条目
    • 或重新定义
  • 重新构建查询字符串

例如:

$str = "first=value&arr[]=foo+bar&arr[]=baz";

parse_str($str, $output);
echo $output['first'];  // value
echo $output['arr'][0]; // foo bar
echo $output['arr'][3]; // baz

而且,为了取回剩下的部分,http_build_query可能有用; - )


作为一个例子:

$str = 'page=6&test=1&test2=2';
parse_str($str, $data);

var_dump($data);
$data['page'] = 10;

$new_str = http_build_query($data);
var_dump($new_str);

第一个var_dump为您提供:

array
  'page' => string '6' (length=1)
  'test' => string '1' (length=1)
  'test2' => string '2' (length=1)

=&GT;你知道页码。

第二个为您提供了一个很好的查询字符串:

string 'page=10&test=1&test2=2' (length=22)

您需要的是: - )

答案 4 :(得分:1)


$url = 'index.php';
if (isset($_GET['page'])) unset($_GET['page']);
if (count($_GET) > 0) $url .= "?".implode("&", $_GET);

答案 5 :(得分:0)

您只需在网址末尾添加新的网页编号,而无需使用旧网页编号。之前的一个将自动替换为新的。

如果您有网址

page.php?page=1&var1=foo&var2=bar&page=100

并且您在PHP中检查了$_GET数组,您会发现$_GET['page']的值为100

如果您想要替换该值,可以使用此正则表达式,而不是删除页码并稍后添加它,您可以在一个preg_replace

中执行此操作
preg_replace('/(page=)\d+/i', '\1' . $newNumber, $_SERVER['argv'][0]);

无论在哪个位置页面上,这都会有效。