php[tek] 2018 : Call for Speakers

Başarım

Şablonların içindeki bazı ögeler diğerlerine göre daha verimli olabilir. Örneğin, [aeiou] gibi bir karakter sınıfı, (a|e|i|o|u) gibi bir olasılık kümesine göre daha verimlidir. Genelde, gerekli davranışı sergileyen en basit oluşum normal olarak en verimli oluşumdur. Jeffrey Friedl'ın kitabı, düzenli ifadelerin verimini arttırmak için en iyilenmeleriyle ilgili bir çok inceleme içerir.

Bir şablon .* ile başlıyorsa ve PCRE_DOTALL seçeneği etkinse, şablon, sadece eşleşmeye konu dizgenin başlangıcı ile eşleşebileceğinden, örtük olarak PCRE tarafından demirlenir. Bununla birlikte, PCRE_DOTALL seçeneği etkin değilse, nokta işleci satırsonu karakteri ile eşleşmeyeceğinden ve eşleşmeye konu dizge çok sayıda satırsonu içeriyorsa şablon dizgenin başlangıcından başka diğer satırsonu karakterlerinin sonrası ile de eşleşeceğinden PCRE bu en iyilemeyi yapamaz. Örneğin, (.*) ikinci şablonu, ilk yakalanan alt dizge "ve" olmak üzere "birinci\nve ikinci" dizgesiyle eşleşir (\n satırsonu karakteridir). PCRE bunu yaparken, eşleşmeye konu dizgedeki her satırsonu karakterinden sonra eşleşme başlatmayı tekrarlamak zorundadır.

Böyle bir şablonu satırsonu karakteri içermeyen bir dizgeyle eşleştirmek için kullanıyorsanız en iyi başarımı PCRE_DOTALL seçeneğini etkin kılarak veya demirlemeyi açıkça belirtmek için şablonu ^.* ile başlatarak sağlayabilirsiniz. Bu, PCRE'yi her satırsonunda eşleşmeyi yeni baştan başlatmaktan kurtarır.

İç içe sonsuz sayıda yineleme içeren şablonlara karşı dikkatli olun. Kendileriyle eşleşmeyen bir dizgeye rastladıklarında sonuç almak çok uzun sürebilir. Örneğin (a+)* şablonunu ele alalım.

Bu şablon "aaaa" dizgesiyle 33 farklı yolla eşleşir ve dizge uzadıkça bu sayı büyük bir hızla artar. (* yinelemesi 0, 1, 2, 3, 4 kere eşleşir ve sıfırdan farklı bütün durumlarda + yinelemeleri farklı kereler eşleşebilir.) Şablonun kalanı böyle olduğu takdirde şablonun tamamıyla eşleşme mümkün olmayacaktır. PCRE kural olarak olası her çeşit yinelemeyi deneyeceğinden bu işlem oldukça uzun bir zaman alacaktır.

Şablonun ardına, (a+)*b şeklinde özel olmayan bir karakter getirilmesi gibi basit çözümlerle bir en iyileme mümkündür. Standart eşleştirme işlemlerine girişmeden önce, PCRE eşleşmeye konu dizgenin sonlarına doğru bir "b" varlığını araştırır; bulamazsa, hemen eşleşmenin başarısız olduğunu bildirir. Ancak böyle arda eklenebilecek özel olmayan bir karakterin yokluğunda bu en iyileme kullanılamaz. (a+)*\d şablonunun davranışını yukarıdaki şablonla karşılaştırarak farkı görebilirsiniz. Birincisi sadece "a"lardan oluşan bir satıra uygulandığında hemen her durumda daima anında başarısız olurken ikincisinin başarısızlığı dizge 20 karakterden uzun olduğunda farkedilebilecek kadar uzun bir süre sonra gerçekleşir.

add a note add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top