php olmayan açgözlü regex sorunu

3 Cevap php

demo:

$str = 'bcs >Hello >If see below!';
$repstr = preg_replace('/>[A-Z0-9].*?see below[^,\.<]*/','',$str);
echo $repstr;

Ben çıkış için bu küçücük program "Merhaba> bcs", ama aslında sadece "bcs" var ne istiyorsun

Ne benim desen nesi var?

3 Cevap

Ben sorun olmayan açgözlü nicelik nasıl davranır misinterpreting konum olduğunu düşünüyorum. Bu operasyonda bir zamanlar, evet, o başka türlü olurdu daha erken durur. Ama aware (ya da, daha sonra gelen potansiyel metin) önce gelir ne değildir. Bu sadece mevcut konumu ile ilgili oluyor. Bu nedenle, deftere düzenli ifade tüm maç olacak:

">Hello >If see below!"

Bunun nasıl çalıştığını görelim:

/>[A-Z0-9].*?see below[^,\.<]*/

Regex ilk "altında görürseniz!> Bcs> Hello" in ">" arar, ve doğru "Merhaba" önce biri ilkini bulur. Tamam, ifade sonraki kısmını kontrol edelim:

[A-Z0-9]

Bir sonraki karakter deseni [A-Z0-9] ile eşleşen bir H,. Hala iyi! Sonraki:

.*?

Şimdi biz gidene kadar olmayan tüm satır karakterleri neticesinde first instance "[^,. <] Aşağıya bakınız *" kalan ifadeleri eşleşecek. Biz sadece düz açgözlü nicelik kullanmış olsaydı biz mümkün olan en son biri eşleşti kadar, biz "[^,. <] Aşağıya bakınız *" belirtilmişse birden fazla durumda maç olabilir. (Dizenizin devam etmişti, ve diğer metin bu desen maç olmuştur istiyorum Yani eğer, o da yakalanan olurdu) dize tüm olası eşleşmeler olmayan açgözlü nicelik doesn't mean that your whole pattern will return the smallest possible match. Bu ne kadar belirli karakter maç fonksiyonlarını belirler.

Daha sonra aşağıdaki deseni denemek isteyebilirsiniz:

/>[A-Z0-9][^>]*?see below[^,\.<]*/

Umarım bu o kadar temizler!

Niye bunu böyle yazmayın:

$str = 'bcs >Hello >If see below!';
$repstr = preg_replace('/>If see below[^,\.<]*/','',$str);
echo $repstr;

This might be a good alternative to what you have. The problem with your regexp is that instead of selecting what you want, you are selecting what you don't want and replacing that with an empty string. The best approach, in my opinion, is selecting what you want, that is what the code below does. What you end up with is what is what is matched by the first sub-pattern otherwise you get your string back.

$str = 'bcs >Hello >If see below!';
$repstr = preg_replace('/^([\w]+ >[\w]+).*?see below.*?$/i', '$1', $str);
var_dump($repstr);

Bu yardımcı olur umarım.