Neden ikisi de str_replace () ve preg_replace () sahip?

8 Cevap php

Perl sonra PHP bilmek geldi, bu yüzden ilk preg_ * fonksiyonu bulduğumda ben temelde sadece bu kullanılır. Daha sonra edebi metin ile uğraşırken str_replace() daha hızlı olduğunu okudum. Yani benim soru str_replace() zaman arama desen özel karakterler kullanmak değildir preg_replace() olarak verimli olamaz, değil mi? Belki sadece regex ve düz metin algoritmalar arasında seçim desen analiz?

8 Cevap

Teorik olarak evet, haklısın. Bu PHP ekibi JIGGER olabilir preg_replace paterni geçirilen analiz etmek ve daha sonra herhangi bir meta-karakter görmedim eğer str_replace için kodu kullanabilirsiniz mümkündür. Analizi varsayarsak bu might daha iyi performans sonuçlar, çok ağır değildi.

Ancak, PHP kaynak kodu (ki, PHP uygulamak için kullanılan kod) organize şekilde bu paylaşım için iyi bir aday değildir. PHP (bazı açılardan) tam bir dil ve daha fazla modül bir koleksiyon azdır.

Yani, başlangıçta PHP grup uzak çapraz tozlaşma modülü bu tür kalmayı tercih etti. Bu noktada, analizi bu tür yapmak için preg_replace fonksiyonunu değiştirerek bir sürü kod kırılma riski olur ve performans iyileştirmeleri küçük olacaktır.

Son olarak, analiz kendisi düşünmek istiyorum daha çözmek için sert bir sorundur. Söyle bana, bu desen yapar

 '/123/'

Ben edebi metin aramak gerektiği anlamına

123

veya düz metin

/123/

Bu işlevi kullanarak içine karışıklık ek bir düzeyde tanıtır ya yorumlanması için zorlayıcı argümanlarla gelmek kolaydır.

Teoride ilginç bir fikir, ancak uygulama ve PHP evrenin bağlamında, o çözer çok daha fazla sorun yaratır.

Maybe just analyzing the pattern to choose between regex and plain text algorithms?

Ben oldukça düzenli ifadelerde ben sadece bazı alt dizeleri değiştirmek istediğiniz her zaman özel bir anlamı vardır şeyi kaçmak zorunda istemem.

Ben regex ayrıştırıcı / motor str_ * nasıl çalıştığını göre ekler yükü hız verim farklılıkları sanırım. Ama ben sadece burada tahmin ediyorum. Şüphesiz, kıyaslama durumunda ve hızlı veya aynı hızda olabilir görmek :)

Orada Regular Expression Matching Speed ile ilgili uzun ve ayrıntılı bir makale ve Wikipedia Implementations and Running times hakkında biraz bilgi vardır ve bir Comparison of Regular Expression engines.

Benzerliklere rağmen, her iki işlevi, dolayısıyla değiştirilebilir oldukça farklıdır. Örneğin, preg_replace replasman normal ifade tarafından yakalanan metne geribaşvuruları içerebilir:

preg_replace ('/(\w+) apple/', '$1 pear', 'A red apple'); // => 'A red pear'

Bu javascript nasıl çalıştığını olduğunu

alert("a.b".replace(".", "X")) // aXb
alert("a.b".replace(/./, "X")) // X.b

yani, tek fonksiyon alt dizeleri ve özel sıradanifade değişmezleri hem de kabul edebilir. Regexp değişmezleri son derece kullanışlı ve bütün dize kitaplığı (tek split yerine "patlayabilir" ve "preg_split" arasında pos yerine strpos "içinde düşünmek daha küçük ve daha esnek hale getirilebilir "ve") "vb preg_match'in.

söyleniyor, ben son derece regexp değişmezleri her zaman yakında php eklenebilir şüpheliyim.

Belki sadece regex ve düz metin algoritmalar arasında seçim desen analiz?

This alone would reduce performance. Ayrıca, preg_*() fonksiyonları basit string işlemleri için gerekli olmayan bir kütüphane kullanımı.

Bir desen eşleştirme, ya da normal bir dize değiştirme kullanmaya çalışıyorum eğer fonksiyon anlayamadık çünkü preg_replace() ile str_replace() değiştirmek mümkün değildir. Yeni işlev, yeni bir parametre kabul olsaydı bunu yapmak mümkün olacaktır, ancak bu durumda eski kodu için bir uyumsuzluk sorunu tanıtmak istiyorum.

preg_replace() bunu bir dize değiştirme optimize yapmak değil yapmak gerektiğini anlamak yapmak için değiştirme. Bu argüman olarak geçirilen dize denetleyin ve başka bir ile bir dize yerine talep ediyorum anlamak gerekir; Bunun için kontrol desen eşleştirme çözmek için kullanılan olabilir zaman alacaktı.

karmaşık değiştirmeleri (fiili bağlantı metin köprü) metne için gebelik iyidir. diğer (bir kelime filtresi gibi) değişen kelimeler gibi içindir.

Eğer bir model ile uyumlu olabilir boşluklar var, aksi takdirde str_replace ile girişimi gebelik kullanın.

Eğer karmaşık şeyler yapıyoruz str_replace ile gebelik de aynı şeyi yapmaya çalışıyor, ancak, aslında yavaştır.

joe