$ 1 $ 2 $ 4 bu preg_replace ne anlama geliyor?

3 Cevap php

Sorgu dizesi ammending ve pre_replace bir yedek parça (yani-$ 1 $ 2 $ 4) ne anlama geldiğini merak ediyordum bu işlevi var.

function add_querystring_var($url, $key, $value) { 
$url = preg_replace('/(.*)(\?|&)' . $key . '=[^&]+?(&)(.*)/i', '$1$2$4', $url . '&'); 
$url = substr($url, 0, -1); 
if (strpos($url, '?') === false) { 
  return ($url . '?' . $key . '=' . $value); 
} else { 
  return ($url . '&' . $key . '=' . $value); 
} 
}

Düzenli ifade malzeme ile çok tanıdık değil. Ben çeşitli yerlerinde yedek parçası '$ 1 $ 2 $ 4' kullanımı yaklaşık 100% preg_replace ama olsun.

3 Cevap

$1, $2... $n düzenli ifade yerine geçer parantez içinde sarılı maçlara referanslar vardır. $0 tüm maç olacağını, $1 ilk parantezli yakalama olurdu, $2, vb ikinci olurdu

  • $1 ilk (.*) ile eşleşen ne olursa olsun bir referans
  • $2 (\?|&) için bir referans olduğunu
  • $4, ikinci (.*) için bir referans olduğunu

Fonksiyonun özel olarak replacement bağımsız değişken, the docs bakınız:

replacement ikincisi formu tercih biri olmak, (PHP 4.0.4) $ n form \ n veya referanslar içerebilir. Her tür referans n'th parantezli desen tarafından yakalanan metin tarafından değiştirilir. n can be from 0 to 99, and \0 or $0 refers to the text matched by the whole pattern. Açılış parantez yakalama alt şablonların sayısını elde etmek için (1'den başlayarak) soldan sağa doğru sayılır. Yedek olarak ters eğik kullanmak için, ("\ \" PHP string) katına olmalıdır.

Perl düzenli ifade değiştirme düzenli ifade parantez içinde parçaları maç değişkenleri kullanır:

   $1   $2                      $3 $4
'/(.*)(\?|&)' . $key . '=[^&]+?(&)(.*)/i'

Yani, değiştirme dizesi $1 atıfta ilk parantez eşleşen ne değiştirecektir. $0 ancak tüm eşleşen dize sevk edecektir.

Hatta bir ters eğik çizgi yerine bir dolar işareti kullanarak düzenli ifadenin kendi içinde parantez alt kümelerini eşleşebilir. Örneğin, iki kelimeyi değiştirmek istedim "", ya da "ve":

preg_replace('/\b(the|and)\b\s*\1/', '$1', $sentence);

Are place holders parantez içinde regex her bölümü için, onlar regex belirtilen kısmını değiştirin.