Nasıl PHP regex ve ilgili parametrelere dayalı bir dize oluşturmak için?

4 Cevap php
(?P<id>\d*)(/(?P<title>.*))?

Çoğu zaman, biz bir şey eşleştirmek için regex kullanabilirsiniz, ancak biz id ve title zaten varsa nasıl eşleşen dize oluşturmak için?

Eğer id=4 ve title='hello world' Örnek, sonuç olmalıdır:

4/hello world

Ama biz sadece varsa id=4, bu olmalıdır:

4

Regex belirttiği gibi, title isteğe bağlı olduğundan.

İki cevap yanlış hem de ...

Hiçbir preg_match henüz yok

4 Cevap

Bunu teklif size düzenli ifadeyi (?P<id>\d*)(/(?P<title>.*))? parametreleri id=4 ve title='' işlev dönecekti ile birlikte bir fonksiyona 4 geçmesi halinde . Ve bu herhangi bir düzenli ifade için çalışacağını söyledi. Bu basitçe imkansız. Düzenli ifade böyle bir işlevi desteklemek oluşamayacağını bir örnektir.

Eğer 4 ardından maç sonuçları yakalama grubu id ve yakalama grup için boş dize için 4 dönecektir dize düzenli ifade ile preg_match ararsanız title. Eğer dize aynı regex preg_match ararsanız 4/ ardından maç sonuçları da yakalama grubu id ve yakalama için boş dize için 4 olacak grup title. PHP boş dize maç yakalama gruplarını ve tüm regex katılmayan yakalama grupları arasında ayrım yapmaz. Hem boş bir dize döndürür. Lütfen regex size yakalama grubu içindeki .*, soru işareti ile grup isteğe bağlı hale vermedi sadece fark da isteğe bağlıdır.

Böylece, iki olası eşleşmeleri 4 ve 4/ yakalama grubu id ve için boş dize getiri 4 preg_match'in hangi için var yakalayan grup title. Peki nasıl ters talep fonksiyonu bu iki yakalama grupları için 4 veya 4/ dönmelidir belirlemek gerekiyordu? Bu ek bilgi olmadan yapılamaz.

Aslında, size regex de / yanı sıra boş dizge ile eşleşir farkında mısın? Normal ifadede her şey opsiyonel!

how to get the original matched string if we have id and title already?

Orijinal Uyumlu dize olmalıdır

$0

Bütün regex maç [(0)] her grup 0 bulunur, bu yüzden {index erişerek matches array preg_match() içinde bu maç alabilirsiniz } an / veya yedek olarak $0 ya da \0 ile preg_replace()

Emin değilim soruyu anlamak, böyle dize inşa demek?

$string = $id;
if ( isset($title) ) {
    $string .= "/$title";
}