Fiyatları değildir numaralarını eşleştirerek

3 Cevap php

Ben metin bir bedende X fiyatlarla (sayılar $ ile başlayan) hariç bütün numaralarını değiştirmek için çalışıyorum. Ben işi almak için arkasına bir göz kullanmaya çalışıyorum, ama çalışmak için görünmüyor. İşte şimdi kullanıyorum budur:

$comments = preg_replace("/(?<!$)([0-9]+)/", "x", $comments);

Bu sadece Önünde $ dahil olmak üzere X ile tüm numaraları yerine biter.

3 Cevap

Sen bir ters eğik çizgi ile dolar işareti kaçmak gerekir, \$, aksi takdirde çizgi / dize sonu olarak yorumlanır.

Ayrıca, set ikinci parantez tamamen gereksizdir - Eğer yakalama grubunu kullanarak değil.

Oh, ve 100 $ gibi bir şey değiştirmekten kaçınmak için size Negatif Geriye İlerleme için 0-9 eklemek gerekir ... Bunu yapıyoruz çünkü, sadece karakter sınıfı içinde dolar yerleştirebilirsiniz ve kaçan gerekli değildir.

Yani bu noktada biz var:

$comments = preg_replace("/(?<![$0-9])[0-9]+/", "x", $comments);

Ama görünüşe göre "preg_replace bir görünüm arkasında repition desteklemiyor" - Seni Geriye İlerleme içinde 0-9 koyamazsınız demek alarak, bunun yerine daha önce bir kelime sınır koyarak kulüpler.

Ayrıca önlemek için bir şey 9,99 $ yerine, bu yüzden umarım biz \ d belirtebilirsiniz. Geriye bakan bu izin vermemek.

Yani kod sonunda olur:

$comments = preg_replace("/(?<!\$|\d\.)\b[0-9]+\b/", "x", $comments);


With all this added complexity, you'll want to create some test cases to make sure that works as intended.

$ (dizenin sonunu simgeleyen) regex özel bir karakterdir. Bunu kaçmak gerekir: \$

Aynı zamanda şu anda formüle, sizin Geriye bakan sadece bir fiyata ilk basamağını yerine onu engelleyebilir; İlk rakamdan sonra yana Geriye bakan Eğer dolar artık madem tekrar maç devam edecektir.

Sen sadece tam sayılara eşleşen rakam dizisinin başlangıcını ve sonunu kısıtlamak için \b (sözcük sınırları) içeren bir şey kullanmak isteyebilirsiniz.

Bu da çalışması gerekir:

/(?<=\s)[0-9]+/