2010-11-18 22 views
3

PHP'de bir URL yönlendirici oluşturmaya çalışıyorum, django gibi çalışıyor.PHP preg_match parçası url

Sorun şu ki, php düzenli ifadeleri çok iyi bilmiyorum.

böyle bir URL ile eşleşmesini edebilmek istiyorum: dizideki ilk regex çalışır

$urls = array(  
    "(^[/]$)" => "home.index",  
    "/post/(?P<post_id>\d+)/" => "home.post",  
); 

ev eşleşecek şekilde:

/post/5/ 
/article/slug-goes-here/ 

Ben regexes bir dizi var sayfa / ama ikincisi işe alamıyorum. İşte

Onları maç için kullanıyorum kodu:

foreach($urls as $regex => $mapper) { 
    if (preg_match($regex, $uri, $matches)) { 
    ... 
    } 
} 

Ben de yukarıdaki örnekte, ben url post_id maç için çalışıyorum dikkat etmelidir: Ben geçirebilmesi için /post/5/5 benim yöntemimle birlikte.

+0

regexes uygun ayraçları olmalıdır – stillstanding

cevap

3

Normal ifadeyi sınırlamanız gerekir. Burada

,/post/(?P<post_id>\d+)/, 

, ben virgül ile regex ayrılmış adres: sınırlayan Eğer desen parçası olarak (örneğin 'i' harf duyarsız eşleşme için gibi) 'seçenekleri' sağlamamıza olanak tanır.

Yayınladığınız gibi, regex'iniz/ile sınırlandırılıyordu. Bu, ikinci/sonraki seçeneklerden sonra "seçenekler" olarak ve yalnızca "gönderi" bölümü ile eşleşmeye çalıştığı anlamına geliyordu.

Karşılaşmaya çalıştığınız örnek, şu anki regex'inize göre gerçekte yaptığınız gibi değil.

Şunun gibi bir eşleşme ile karşılaşacaksanız; Sonra

/post/P1234/ 

aşağıdaki: Size :)

Edit

için o kadar temizler

Array 
(
    [0] => /post/P1234/ 
    [1] => P1234 
) 

Umarım:

preg_match(',/post/(P\d+)/,', '/post/P1234/', $matches); 
print_r($matches); 

sonuçlanacaktır senin OP yorum dayanarak

, sadece URL/posta/parçanın sonra bir sayı maç için çalışıyoruz, bu nedenle bu biraz basitleştirilmiş versiyonu:

preg_match(',/post/(\d+)/,', '/post/1234/', $matches); 
print_r($matches); 

sonuçlanacaktır içinde:

Array 
(
    [0] => /post/1234/ 
    [1] => 1234 
) 
+0

Ahhh, sen benim gece yapılan, teşekkürler! Bunun için 20 oy verebilseydim. – imns

+0

Sorun değil - regex'i sınırlama, ilk başladığımda birkaç kez beni şaşırttı ve php.net üzerinde herhangi bir açıklama yok! –

1

ikinci RegExp makalesinde/gibi bir URL ile eşleşmesini içindir Eğer/sümüklüböcek-gider burada /, sonra doğru düzenli ifade yapmalı

#\/article\/[\w-]+\/# 

olduğunu!// Kaçmak zorunda kalmadan emin değilim, böylece onları kaçmadan deneyebilirsiniz. Ben tahmin etme etiketi bir .NET örneğinden çıkarılır, çünkü bu çerçeve eşleşen grupları adlandırmak için bu tür etiketleri kullanır.

Umarım yardımcı olabilirim!