PHP'de ereg ifadelerini nasıl preg'ye dönüştürebilirim?


140

Yana POSIX düzenli ifadeler (Ereg) PHP 5.3.0 ve sonrasında artık kullanılmamaktadır, ben eski ifadeleri dönüştürmek için kolay bir yol öğrenmek istiyorum PCRE'nin (Perl Uyumlu Normal İfadeler) (emprenye edilmiş) .

Örnek olarak, bu düzenli ifade var:

eregi('^hello world');

İfadeleri preg_matchuyumlu ifadelere nasıl çevirebilirim ?

Not: Bu yayın, ereg'den preg'ye dönüşümle ilgili tüm yayınlar için yer tutucu ve ilgili sorular için yinelenen seçenekler olarak hizmet eder. Lütfen bu soruyu kapatmayın.

İlişkili:


2
@ yes123: Evet, mesele bu, bundan da bıktım. Tüm bu bireysel soruları kapatabilmemiz için bir şeyi açıklayan bir wiki yazısı istiyorum.
netcoder

Sanırım buna gerek yok çünkü sadece eskiyi bir sınırlayıcıyla sarmanız gerekiyor. Ayrıca bunun için daha önce cevaplanmış bir soru kullanabilirsiniz.
dinamik

Ah, yorumları okumadan önce kapanış için oy kullandı. Bir yer tutucu olarak bir amaca hizmet edebilirdi, ancak bu şekilde hizmet edebilecek başka bir eski soru yok mu?
Wrikken

Hmm, gerçekten. ereg [php]çok faydalı sonuçlar vermez. Tamam, bunu destekleyebilirim.
Temmuz

8
Millet, neredeyse bu konuyu işaret eden bir dizi kapalı soru oluşturduk gibi görünüyor. Bu oranda hepsi kapanacak :)
Kev

Yanıtlar:


142

Sözdizimindeki en büyük değişiklik, sınırlayıcıların eklenmesidir .

ereg('^hello', $str);
preg_match('/^hello/', $str);

Sınırlayıcılar, alfasayısal olmayan, ters eğik çizgi veya boşluk karakteri olan hemen hemen her şey olabilir. En çok kullanılan genel olarak ~, /ve #.

Eşleşen parantezleri de kullanabilirsiniz:

preg_match('[^hello]', $str);
preg_match('(^hello)', $str);
preg_match('{^hello}', $str);
// etc

Sınırlayıcınız normal ifadede bulunursa, bundan kaçmanız gerekir:

ereg('^/hello', $str);
preg_match('/^\/hello/', $str);

Bir dizgideki tüm sınırlayıcılardan ve ayrılmış karakterlerden preg_quote kullanarak kolayca kaçabilirsiniz :

$expr = preg_quote('/hello', '/');
preg_match('/^'.$expr.'/', $str);

Ayrıca, PCRE çeşitli şeyler için değiştiricileri destekler . En çok kullanılanlardan biri, eregi'yei alternatif olan büyük / küçük harfe duyarlı olmayan değiştiricidir :

eregi('^hello', 'HELLO');
preg_match('/^hello/i', 'HELLO');

PHP'de PCRE sözdizimi için tam referansın yanı sıra ifadenin dönüştürülmesine yardımcı olmak için POSIX normal ifadesi ve PCRE arasındaki farkların bir listesini bulabilirsiniz .

Ancak, basit örneğinizde normal bir ifade kullanmazsınız:

stripos($str, 'hello world') === 0

2
Harika açıklama! Sadece senin dönüştürme edildiği bir özel durum eklemek istediğiniz ereg için preg_match ve ayrılmış karakterler sadece sınırlayıcıları ve gerek (onlar zaten özel karakterler olarak çalışıyorlardı çünkü biz onları kaçmak istemiyorum) : preg_match ('/'. str_replace ('/', '\ /', $ ifade). '/', $ str);
Lolito

Eşleşen köşeli ayraçlar kullanırsanız , örnek gibi diğer sembollerle yaptığınız gibi "sınırlayıcı ile aynı olduğu için" herhangi bir karakterden kaçmanız gerekmediğini özellikle belirtmek gerekir /^\/hello/. (a(b)c)tamamen geçerli, sınırlandırılmış bir PCRE'dir. Şahsen (), ilk yakalanan maçın her şey olduğunu kendime hatırlatmak için parantez kullanmayı seviyorum .
Niet the Dark Absol

Söyleyebilir miyim, PHP'den nefret ediyorum! (Sadece bu. Başka bir şey.) Paylaşılan web barındırma sunucum yeni bir sürüme güncellenir ve error_logs bu uyarılarla dolu olsun: Bu cevapları aramak zorunda PHP Deprecated: Function ereg() is deprecated in.... Ahh!
c00000fd

nasıl dönüştürülür? $ regex = $ e. '((\. [^ \.'. $ e. '] [^'. $ e. '] *) | (\. \. [^'. $ e. '] +) | ([^ \. ] [^ '. $ e.'] *)) '. $ e. '\. \.' . E $; preg_math sadece / değiştirici /
bdalina

32

Preg (PHP 5.3.0'dan itibaren) ile Ereg değiştirme bizim lehimize doğru hareket oldu.

Perl uyumlu düzenli ifade sözdizimi kullanan preg_match genellikle ereg'e daha hızlı bir alternatiftir.

Preg için ereg desenleri için 4 ana şey bilmelisiniz:

  1. Sınırlayıcı ekle (/):'pattern' => '/pattern/'

  2. Desenin bir parçasıysa ayırıcıdan kaçın : 'patt/ern' => '/patt\/ern/'
    Programlı olarak aşağıdaki şekilde elde edin:
    $old_pattern = '<div>.+</div>';
    $new_pattern = '/' . addcslashes($old_pattern, '/') . '/';

  3. eregi (büyük / küçük harf duyarsız eşleme): 'pattern' => '/pattern/i' Yani, büyük / küçük harf duyarsız eşleme için eregi işlevini kullanıyorsanız, yeni desenin sonuna 'i' ekleyin ('/ pattern /').

  4. ASCII değerleri : ereg'de, desende sayı kullanırsanız, bir karakterin ASCII'sine başvurduğunuz varsayılır. Ancak preg'de sayı ASCII değeri olarak değerlendirilmez. Dolayısıyla, deseniniz ereg ifadesinde ASCII değeri içeriyorsa (örneğin: yeni satır, sekmeler vb.), Onaltılık biçime dönüştürün ve \ x ile önekleyin.
    Example: 9(tab) becomes \x9 or alternatively use \t.


8

PHP 5.3 sürümünden ereg, kullanımdan kaldırılmıştır.

'Den' erege preg_matchgeçiş bizim modelimizde sadece küçük bir değişikliktir.

İlk olarak, kodunuza sınırlayıcılar eklemeniz gerekir, örneğin:

ereg('A-Z0-9a-z', 'string');

için

preg_match('/A-Z0-9a-z/', 'string');

Büyük / eregiküçük harfe duyarlı olmayan eşleme iiçin son sınırlayıcıdan sonra koyun , örn:

eregi('pattern', 'string');

için

preg_match ('/pattern/i', 'string');

7

Sözdizimi arasında ereg()ve preg_replace()sözdiziminden daha fazla fark vardır :

  • Geri dönüş değeri:

    • Hata durumunda : her ikisi de geri dönerFALSE
    • Eşleşmediğinde : ereg()döner FALSE, preg_match()döner0
    • Maçta : ereg()dize uzunluğunu döndürür veya 1, preg_match()her zaman döndürür1
  • Eşleşen alt dizelerin sonuç dizisi: Bazı alt dizeler hiç bulunmazsa ((b) içinde ...a(b)?öğeyi gelen) ereg()sonucu olacak FALSEiken, preg_match()hepsi ayarlanmış edilmeyecektir.

Biri dönüştürmek cesur yeterli değilse özel hayatının ereg()etmek preg_match(), o kullanabilir mb_ereg () PHP 7'de hala kullanılabilir olduğu.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.