RegEx dize "preg_replace"

5 Cevap php

Yapmam gereken bir "bul ve değiştir" CSV dosyası yaklaşık 45k hatlarında ve daha sonra bir veritabanına koymak.

Ben PHP ve preg_replace ile bunu yapmak mümkün olmalıdır düşündüm ama ifadeyi anlamaya gibi olamaz ...

Çizgiler bir alan oluşur ve tüm aşağıdaki biçimdedir:

"./1/024/9780310320241/SPSTANDARD.9780310320241.jpg" Ya da "./t/fla/8204909_flat/SPSTANDARD.8204909_flat.jpg"

İlk bölümü her zaman ikinci kısmı her zaman bir alfasayısal karakter olacak, bir dönem olacak, üçüncü daima üç karakterden olacak ve dördüncü her zaman 1 ve 13 alfanümerik karakter arasında olmalıdır.

Ancak ben açıkça bu benim için biraz yeni, düzenli ifadeler hakkında tüm pek bilmeden ikrar edecek doğru gibi görünüyor aşağıdaki ile geldi! Herhalde burada aptalca hatalar bütün yükü yapıyorum ...

$pattern = "/^(\.\/[0-9a-zA-Z]{1}\/[0-9a-zA-Z]{3}\/[0-9a-zA-Z]{1,13}\/)$/";
$new = preg_replace($pattern, " ", $i);

Neyse her türlü yardım takdir!

Thanks, Phil

5 Cevap

Seni soruyorsun anlamak emin değilim. Ne demek istiyorsun dosyasındaki her satır gibi görünüyor, ve hepsini işlemek istiyorsun? Eğer öyleyse, bu regex hile yapardı:

'#^.*/#'

Bu sadece yukarı ve bu haydut '$' herkesin bahsettiği için değil eğer regex ne yapardınız son bölü, dahil her şeyi eşleşir. Yalnız bırakmak istediğiniz diğer formatlarda diğer çizgiler varsa, bu regex muhtemelen sizin ihtiyaçlarınıza uygun:

'#^\./\w/\w{3}/\w{1,13}/#"

Ben bu yüzden içeride bölü kaçmak zorunda değilsiniz '#' için '/' den regex ayırıcısını nasıl değiştiğini dikkat edin. Sen sınırlandırıcıları için hemen hemen her noktalama karakteri kullanabilirsiniz (ama tabii ki her ikisi de aynı olmak zorunda).

Ben encouter tek hata $ çıkarılmalıdır dize sonu için çapası. Ve ifadesi de _ karakteri eksik:

/^(\.\/[0-9a-zA-Z]{1}\/[0-9a-zA-Z]{3}\/[0-9a-zA-Z_]{1,13}\/)/

Daha genel bir model sadece / dışlamak olacaktır:

/^(\.\/[^\/]{1}\/[^\/]{3}\/[^\/]{1,13}\/)/

Sen PHP's builtin parser herhangi bir desen eşleştirme önce CSV dışarı değerleri ayıklamak için kullanmak gerekir.

$ dize sonu anlamına geliyor. Onların hattında yalnız olsaydı Yani desen ./1/024/9780310320241/ maç ve ./t/fla/8204909_flat/ olur. $ çıkarın ve bir boşluk onları yerine, sizin dizesinin ilk dört bölümden maç olacak.

$pattern = "/(\.\/[0-9a-z]{1}\/[0-9a-z]{3}\/[0-9a-z\_]+\.(jpg|bmp|jpeg|png))\n/is";

Ben sadece örnek dize / ile bitmiyor, bu yüzden sonunda desen onu kaldırmak gerekir olabileceğini gördüm. Ayrıca dosya kullanılan çizgi ve karakter sınıfında olmalıdır.