Bunu düzeltmek regex miyim?

5 Cevap php

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

Kayışının page=6 Bu kapalı Aşağıdaki kodu bu yüzden url için yeni bir sayfa eklemek ve tekrar bizim linke $ url_without_page_var ekleyin:

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

Ve

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

Ok so that code lets me take the page=6 off of page=6&test=1&test2=2 I can then change the page number and add this all back together.

My problem is often the page in the URL will not always be in the same position, it may not be the 1st or last items Ve this is what will happen when, see how the URL is incorrect now;

/ Page.php dosyasında? & Test = 1 & dnm2 = 2 ERROR-HERE-ALSO page = 9

Is it possible to fix this?

5 Cevap

$_GET değişkeni URL yoluyla ayarlanmış tüm değişkenlerin bir dizi sağlar. $_REQUEST ayarlanmış tüm GET ve POST değişken bir dizidir. İşte balık:

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

Regex is a bit overkill for this problem. Hope it makes sense. I've been writing Python and Javascript for the past few weeks. PHP feels like a step backwards.

EDIT: Bu kod beni mutlu kılar. Ben aslında bunun yerine körü körüne parmak yazarak ve kapısı test.

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 = "&";
	}
}

Neden sadece url yeniden olamaz?

 $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 gerektirir ama kolayca bu işlevi yazabilirsiniz.

EDIT: kodunu düzeltmek için $ uzunluk değişkeni eklendi.

Eğer, parse_str bakmak için sorgu dizesinden bilgileri ayıklamak ve bir dizi olarak onları almak isteyebilirsiniz

Daha sonra can

Örneğin:

$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

Ve, togetehr, http_build_query might be useful ;-) kalan parçalarını geri almak için


Örnek olarak:

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

İlk var_dump bu veriyor:

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

=> Sen sayfa numarasını biliyorum.

Ve ikinci bir güzel sorgu dizesi verir:

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

Neye ihtiyacınız olması gereken :-)

İsteğe bağlı firar ve işareti aramak ve de bunu silmek için regexpi değiştirin. Eğer tekrar bir araya URL koymak Sonra, gerektiğinde bir işareti koymak.

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

Sen sadece eski biri ile bir şey yapmadan URL'nin sonunda yeni bir sayfa numarası ekleyebilirsiniz. Daha önce biri otomatik olarak yenisi ile değiştirilecektir.

Eğer bir URL varsa

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

ve sen o $_GET['page'] 100 değerine sahip göreceksiniz PHP sizin $_GET dizi kontrol

Eğer değerini değiştirmek istiyorsanız bu regex kullanmak yerine sayfa numarası sıyırma ve daha sonra bir preg_replace bu yapabileceğini ekleyebilirsiniz

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

O olursa olsun üzerinde hangi pozisyonda sayfa çalışacaktır.