Tricky Soru: Birden fazla regexes sonuçları Nasıl sipariş

3 Cevap php

Onları ayırmak için | Şu anda ya da işaret kullanarak, bir preg_match'in 3 farklı düzenli ifadeler kullanın. Bu mükemmel çalışır. Bununla birlikte, birinci ve ikinci düzenli ifade çıkışının aynı tür. örneğin [0] Kaynak Metin [1] [2] İsim Numara Tutarı - bu kaynak metin sonuçlarının farklı bir düzenleme kullanır beri ancak sonuncusu: [0] Kaynak Metin [1] Adı [2] Adet Tutar.

    preg_match('/^Guo (\d+) Cars @(\w+)|^AV (\d+) Cars @(\w+)|^@(\w+) (\d+) [#]?av/i', $source, $output);

Name sayısal olarak mümkün olduğundan ben sayısal olup olmadığını görmek için basit bir kontrol yapamamaktadır. Ben regex sırasını değiştirmek ya da çok uyumlu regex hangi belirleyebilir ya bir yolu var mı. Hız yüzden 3 ayrı preg_match ifadeleri (ve gelmek için daha fazla) kullanmak istemiyordu burada unsurdur.

3 Cevap

Üç ayrı düzenli ifadeler yavaş olmak zorunda değilsiniz. Bir büyük beyanı düzenli ifade motoru için Backtracing bir sürü anlamına gelecektir. Düzenli ifade optimizasyonu anahtar motor kısa sürede başarısız yapmaktır. Onları appart çekerek bazı kıyaslama yaptınız mı?

Sizin durumunuzda PCRE 's isimli yakalar (?<name>match something here) yararlanabilir ve ${name} yerine \1 ile değiştirin. Ben bu preg_replace için çalışır% 100 emin değilim. Ama, kesin yakalar adında preg_match doğru saklar biliyorum.

PCRE yazılan (RoBorg en gibi) bu durumda da yararlı olması için PCRE_DUPNAMES seçeneği ile derlenmesi gerekir. PHP'nin derlenmiş PCRE DLL dosyası bu seçenek kümesi varsa emin değilim.

Sen adında yakalama gruplarını kullanabilirsiniz:

preg_match('/^Guo (?P<number_amount>\d+) Cars @(?P<name>\w+)|^AV (?P<number_amount>\d+) Cars @(?P<name>\w+)|^@(?P<name>\w+) (?P<number_amount>\d+) [#]?av/i', $source, $output);