PHP &

3 Cevap php

Ben gibi adresler kullanabilir böylece ben, index.php içine her isteğini yönlendirmek için yapılandırılmış benim sunucunun apache var:

http://www.website.com/about/us

Şimdi her yol var ve ne ondan beklemek olmadığını belirlemek için url ayrıştırmak gerekiyor, bu yüzden yolları kaydetmek için bir veritabanı tablo ayarlamak ve onları olmak ister gibi bu yüzden benim müşterilerin yolları düzenleyebilirsiniz. Şey ben şimdiye kadar ayrıştırma yapmak mümkün değilim olduğunu.

İşte benim kod:

$uri = 'about/us';
$regex = '(page(/<action>))';
if ( ! preg_match($regex, $uri, $matches)) {
    echo 'the route doesn\'t match';
    exit();
}

O zaman bu yankı mesaj gösterir. Ben yanlış ne yapıyorum?

edit:

Ben aşağıdaki gibi regex neden ihtiyaç nedenidir. Ben bir url kesimi var Imagine gibi:

/user/yoda

Burada regex bir eylem veya sayfa olarak ilk argüman, ve sadece ben beklemek istiyorum gibi, bu durumda, ikinci parametresine sadece maç için, karakter belirli bir dizi sağlayacak bir anahtar olarak ikinci ayrıştırmak için yararlı olacaktır "_-azAZ09", böyle bir şey. Diğer bir deyişle, regex ifadelerin kümesi bana bunlardan herhangi uri eşleşen olmadığını belirlemek ve bundan almaya eylemi belirlemek için URI göre olacaktır. Patlayabilir fonksiyonunu kullanarak, beni daha sonra kodunuzda uri kesimleri değerlendirmek yapmak Ben önlemek istiyorum wich istiyorum. URI hiçbir maç varsa, hemen bir 404 birine sayfa ileri ve operasyon bölünürler. Kendimi açıkça bilmiyorum ..

3 Cevap

Bunun yerine düzenli ifadeler kullanarak, neden sadece gelen URI bölmek değil?

$uri = 'about/us';
list($page, $action) = explode('/', $uri);

İkiden fazla ihtiyacınız varsa, sadece liste çıkarmak:

$pagePath = explode('/', $uri);

Ancak, insist düzenli ifadeler kullanarak, bunu eğer:

$regex = '#(?P<page>.*)/(?P<action>.*)#';

Ama gerçekten ihtiyacınız varsa, youcan kullanımı list(), yukarıda gösterildiği gibi - Ancak, sana o $ karşılaşmalar şimdi $matches['page'] ve $matches['action'] içerecektir dışında özel bir şey sunuyor.


Using the explode function would make me evaluate the uri segments later in the code, wich I'd like to avoid

Bunun yerine emin sayfası geçerlidir yapma ile o karakter seti, neden Geçerli sayfalar arama tablosunun bir listesini derlemek değil ve sadece kullanmak php in_array ki çok daha hızlı bir düzenli ifadenin daha? Bulunuyor Bir diziye URL kesimleri ayıklanıyor hiçbir zaman valide çok boyutlu diziler var sağlayacaktır.

Ben regex bir sembolü çevrili olması gerektiğini düşünüyorum; örneğin, '@(page(/<action>))@'. http://php.net/preg_match örneklere bakın

Kesinlikle nedense regex kullanmanız gerekiyorsa bu deneyin:

$uri = 'about/us';
$regex = '~(?<path>[^/]+)/(?<action>.+)~';
var_dump($matches);

Hangi çıkışlar:

array(5) {
  [0]=>
  string(8) "about/us"
  ["path"]=>
  string(5) "about"
  [1]=>
  string(5) "about"
  ["action"]=>
  string(2) "us"
  [2]=>
  string(2) "us"
}

Yol bileşeni tek bir düzey aşağı gider Ancak bu sadece çalışacak!