Regex Soru Again!

6 Cevap php

Gerçekten benim sorunum son zamanlarda ne olduğunu bilmiyorum, ama Regex bana en fazla sorun veriyor gibi görünüyor.

Çok basit bir şey yapmam gerekiyor, ama bunu almak için görünmüyor olabilir:

I / xmlfeed / veya xmlfeed / ne / / Bu da döndüren bir uri var

Ben herhangi bir vesileyle / xmlfeed maç istiyorum.

Ben aşağıdaki birçok varyasyonu denedim:

preg_match('/(\/.*?)\/?/', $_SERVER['REQUEST_URI'], $match);

Ben bu okurdum: İsteğe bağlı forwardslash gelene kadar Maç forwardslash sonra herhangi bir karakter maç.

6 Cevap

Neden olmasın:

preg_match ('#/[^/]+#', _SERVER['REQUEST_URI'], $match);

?

$match[0] neye ihtiyacınız verecek

neden seni şaşkın hale Regex gerekiyor?

$string = "/xmlfeed/what/is/this";
$s = explode("/",$string,3);
print "/".$s[1]."\n";

çıktı

$ php test.php
/xmlfeed

Senin sorunun isteksiz nicelik olduğunu. Ilk çizgi eşleşti sonra, .*? sıfır kendisine izin verilen minimum karakter sayısını tüketir. Sonra /? üzerine alır; o (ilk bölü hemen sonra olduğu) bir sonraki pozisyonda bir çizgi görmüyor, ancak isteğe çünkü o tamam. Sonuç: regex her zaman tek bir çizgi ile eşleşen ve grubu 1. sırada her zaman boş bir dizeyle eşleşir.

Açıkçası, sadece açgözlü biri ile isteksiz nicelik yerini alamaz. Eğer bir bölü maç olamaz şey ile .* olarak değiştirin ama eğer hırs konusunda endişelenmenize gerek yok. İşte K Prime 's regex, '#/[^/]+#' yaptığı budur. Hem de o nasıl kullandığına dikkat # regex sınırlayıcı olarak ve regex içinde bölü kaçan gerekliliğini önler.

PHP: '/(\/.*?)\/?/' normal bir ifade içeren bir dizedir.

İlk dize şifresini çözmek zorunda: /(/.*?)\/?/

Yani sonuç ifadesini başlar eğik çizgi var. Bir açılış ayracı. Ifadenin eşleşen parçası biter ... ve ben bunu daha sonra ayraç hata kapalı değil çünkü eminim bir eğik.

Yani, bu çalışma almak için:

  • Dizeleri and düzenli ifadeler özel anlamlarla karakterler kaçış unutmayın
  • Eğik çizgi ile eğik / karıştırmayın \

Sen sonra ilk çizgi dahil her şeyi karşılayan istiyorum, ancak herhangi bir (isteğe bağlı) ikinci eğik önce (yani biz olmayan açgözlü yapar ? istemiyorum):

/(\/[^\/]*)/

Hangi bir PHP dize olarak ifade:

'/(\\/([^\\/]*)/'

Ben bu regex kaçınarak, ve bu nedenle soru kaçınır biliyorum, ama nasıl bir diziye (bölü çizgilerinde) URI bölme hakkında.

Sonra dizinin elemanları ile başa çıkmak, ve istemediğiniz Uri bitlerini göz ardı edebilirsiniz.

Yayınlanan önerileri kullanarak, ben bu kadar çalışıyorum erdi:

echo $_SERVER['REQUEST_URI'];
preg_match("/(\/.*)[^\/]/", $_SERVER['REQUEST_URI'], $match);
$url = "http://".$_SERVER['SERVER_NAME'].$match[0];
foreach($match as $k=>$v){
  echo "<h1>$k - $v</h1>";
}

Ben de olmadan denedim. * Ve parantez olmadan.

Olmadan. * VE () SADECE sonraki karakter ile / döndürür.

Olduğu gibi, sadece tüm URI her şey döner

Yukarıdaki kod ile koştu Peki, ne zaman, çıktı

/tea-time-blog/post/20 0 - /tea-time-blog/post/20 1 - /tea-time-blog/post/2

Bu kod eval olmak () 'Bu arada d. Edilir Ben PHP düzenli ifadeyi işleme şekilde herhangi differnce yapmak gerektiğini sanmıyorum.