Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php regex能解决这个问题吗?_Php_Regex - Fatal编程技术网

Php regex能解决这个问题吗?

Php regex能解决这个问题吗?,php,regex,Php,Regex,页面:/index.php?页面=6&test=1&test2=2 下面的代码去掉了这一部分的page=6,这样我就可以将我们的新页面添加到url中,并将$url\u(不带页面)变量再次添加到我们的链接中: $_SERVER['argv'][0] // Displays: page=6&test=1&test2=2 及 好的,代码允许我将页面=6从页面=6&test=1&test2=2中去掉 然后,我可以更改页码并将其全部添加到一起 我的问题是,URL中的页面通常不会始终处

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

下面的代码去掉了这一部分的page=6,这样我就可以将我们的新页面添加到url中,并将$url\u(不带页面)变量再次添加到我们的链接中:

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

好的,代码允许我将页面=6页面=6&test=1&test2=2中去掉 然后,我可以更改页码并将其全部添加到一起

我的问题是,URL中的页面通常不会始终处于相同的位置,它可能不是第一个或最后一个项目 这就是当看到URL现在是如何不正确时会发生的事情

/php?&**test=1&test2=2**ERROR-HERE-allpage=9


有可能解决这个问题吗?您只需在URL末尾添加一个新的页码,而无需对旧页码执行任何操作。以前的将自动替换为新的

如果你有一个网址

page.php?page=1&var1=foo&var2=bar&page=100
在PHP中检查
$\u GET
数组,您将看到
$\u GET['page']
的值为
100

如果要替换该值,可以使用此正则表达式,而不是剥离页码并在以后添加,您可以在一个
preg\u replace

preg_replace('/(page=)\d+/i', '\1' . $newNumber, $_SERVER['argv'][0]);

无论在哪个位置页面上,这都会起作用。

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

那你就可以了

  • 从数组中删除
    页面
    项,例如
    • 或者重新定义它
  • 重新构造查询字符串
例如:

$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
而且,为了把剩下的部分重新组装起来,可能会很有用


例如:

$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\u dump
为您提供以下信息:

array
  'page' => string '6' (length=1)
  'test' => string '1' (length=1)
  'test2' => string '2' (length=1)
=>您知道页码

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

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

这应该是您所需要的:-)

修改您的regexp以查找可选的尾随符号,并将其删除。然后,当您将URL重新组合在一起时,在必要的地方添加一个符号和

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

为什么你不能重建url

 $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变量以修复代码。

变量
$\u GET
提供通过URL设置的所有变量的数组
$\u REQUEST
是所有
GET
POST
变量集的数组。这是鱼:

$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;
    }
}

是的,我希望避免这种想法,在我的答案中添加了替代解决方案。这是我希望做的,但是当页面是第一项时,我不希望它删除&如果我一直是一个新的&可能会破坏url的,你知道吗?如果页面是第一项,你肯定会想删除符号。使用像“index.php?&var1=1”这样的URL是半错误的。它应该是“index.php?var1=1”才正确。然而,向URL添加新的符号不能破坏它。也不应该有理由在没有一组数据值的情况下在上面堆积符号。除了我得到的输出是
index.php?&test=1&test2=2之外,这几乎可以完美地工作。请看它还添加了一个&right after.php?你知道怎么解决吗?+1,同意这里不应该使用Regexp。我也喜欢你使用的这个方法。事实上,看看你的代码,我看到你的代码没有添加到index.php中。我的实际文件是test3.php,我更改了它,它确实有效。谢谢!现在我只有一个问题,也许你有一个想法,你的代码是完美的,如果有2个或更多的变量,但如果页面是唯一存在的,当它添加“&page=PAGENUMBER”到它,那么它将有我添加的-,就在后面?马克,我的意思是,在我的网站上,这种情况非常罕见,但最好是正确编码,这样它就永远不会中断,还有什么方法可以动态地为任何不需要检查的页面名称填写$url\u string=“index.php”!空($\u GET[“page”])。只需删除它。+1用于
http\u build\u query()
。我知道它需要PHP5,但PHP4在PHP世界中相当于IE6。。。这是一个他妈的疼痛,只是不想消失。
$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;
    }
}
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 = "&";
    }
}

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