Php regex能解决这个问题吗?
页面:/index.php?页面=6&test=1&test2=2 下面的代码去掉了这一部分的page=6,这样我就可以将我们的新页面添加到url中,并将$url\u(不带页面)变量再次添加到我们的链接中: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中的页面通常不会始终处
$_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);