PHP RegExpr hatası Bilinmeyen değiştirici '('

2 Cevap php

Ben bu normal bir ifade var:

([http://some.url.com/index.php?showtopic=\"]*)([0-9]+(?:\.[0-9]*)?)

onun forumdan konulara bağlantılar ayıklamak için

Şimdi benim komut dosyası kullandığınızda

$url = "([http://some.url.com/index.php?showtopic=\"]*)([0-9]+(?:\.[0-9]*)?)";

preg_match_all tükürür: "Bilinmeyen değiştirici '('"

Bu da preg_match için çağrı

preg_match_all($url, $str, $matches,PREG_OFFSET_CAPTURE,3);

Herkes bu açıkça aptal sorunu ile bana yardımcı olabilir

2 Cevap

PCRE optional modifiers gelen gerçek normal ifade ayrı delimiters gerektirir. PHP ile herhangi bir alfanümerik olmayan, non-eğik çizgi, boşluk olmayan karakter ve çiftleri (parantez) gelip hatta sınırlayıcı kullanabilirsiniz.

Senin durumunda ( sınırlayıcı olarak kullanılır ve ilk gelen ) normal ifadenin sonunu kapanış lider; geri kalanı modifiye ediciler olarak kabul edilir:

([http://some.url.com/index.php?showtopic=\"]*)([0-9]+(?:\.[0-9]*)?)
^                                             ^

Ama biten ayıracından sonra ilk karakter (() geçerli bir değiştirici değildir. Bu hata mesajı Bilinmeyen değiştirici '(' diyor neden.

Çoğu durumda, / Perl gibi sınırlayıcı olarak kullanılır. Ama bu normal ifadede / her oluşumunu kaçmak için gerektirir. Bu yüzden düzenli ifadede değil bir sınırlayıcı seçmek için iyi bir seçimdir. Senin durumunda kullanmak # like BoltClock suggested. Olabilir

Oh, ve bu arada: [http://some.url.com/index.php?showtopic=\"] gibi bir karakter sınıfı listelenen karakterlerden sadece tek bir karakteri temsil eder. Yani ya h, t, p, :, /, vb {ifade soruyorsan [(6)]}, kelimenin tam anlamıyla, sadece http://some\.url\.com/index\.php\?showtopic=" (meta karakterleri kaçmak için unutma) kullanın.

Siz sınırlandırıcıları düzenli ifade sarmak gerekir. Özel PCRE meta karakter olmayan herhangi bir karakter yapacak, ben kullanmak gerekir #:

$url = "#([http://some.url.com/index.php?showtopic=\"]*)([0-9]+(?:\.[0-9]*)?)#";

Sen the PHP manual section for PCRE delimiters içinde sınırlayıcı hakkında daha fazla bilgi edinebilirsiniz.