Ben şimdi / sayfa.html gibi uri ile uğraşıyorum? K1 = 1 & k2 = 2
$str = preg_replace('/[&\?]' . $k . '=[^&]*/',"",$str);
$ K silmek için yukarıdaki amaçlar uri yer ile ilgili değil, aynı zamanda siler? yanlış.
Doğru olanı yapmak nasıl?
Bu deneyin:
preg_replace('/(?:(\?)|&)' . $k . '=[^&]*/', '$1', $str)
Bu ek kullanmak preg_quote
on $k
. Olmalıdır
Edit İşte yukarıda bir genişletilmiş versiyonu düzeltmek gerekir var problem described by beggs:
/(?:(\?)|&)arg=[^&]*(?(1)(?:&|$))/
(?(1)(?:&|$))
epxression ilk grup bir eşleşme bulursa, bir conditional expression o kullanılır olmasıdır. ?
bulunursa Yani, &
o parametrenin sondaki kaldırılır.
Bir sorgu dizesi bir kısmını kaldırmak için, URL'leri işlemek için var, düzenli ifadeler, ancak işlevleri kullanmak olmaz.
Örneğin, bir URL bölümlerini ayıklamak için parse_url
a> işlevini kullanan bu kod parçasını göz önüne:
$url = '/page.html?k1=1&k2=2';
$parts = parse_url($url);
var_dump($parts);
Alırsınız:
array
'path' => string '/page.html' (length=10)
'query' => string 'k1=1&k2=2' (length=9)
Sen şimdi, orijinal sorgu dizesinde bulunan bilgileri ayıklamak parse_str
a>:
$params = array();
parse_str($parts['query'], $params);
var_dump($params);
Seni alacak olan:
array
'k1' => string '1' (length=1)
'k2' => string '2' (length=1)
Şimdi dizide varsa, bir parametre kaldırmak için, test edebilir, ve, evet, çıkarın:
$to_remove = 'k1';
if (array_key_exists($to_remove, $params)) {
unset($params[$to_remove]);
}
var_dump($params);
Şimdi parametreleri şu diziyi verir:
array
'k2' => string '2' (length=1)
Ve, son olarak, bir arada kullanarak, parçaları geri koymak http_build_query
a> yapabilirsiniz:
$new_query = http_build_query($params);
var_dump($new_query);
Ve sen olsun:
string 'k2=2' (length=4)
Sen şimdi sadece URL sonra bu enjekte etmek zorunda ;-)
Some might say it's a bit longer... I would answer that, looking at this code, one immediatly inderstands its purpose -- which is not quite the case with a complex regex.
URL'ler ve sorgu dizeleri ile ilgili iseniz, parse_url URL bileşenleri ayıklamak ve parse_str sorgu dizesi bit ayıklamak için kullanmak isteyebilirsiniz. Bunun yerine regexes ile ilgili argümanlar dizisini işlemek için çok daha kolay olacak. Daha sonra http_build_query tekrar bir araya koymak için kullanabilirsiniz.