Nasıl bölünmüş ve bir dize yerine?

2 Cevap php

Ben bir dize var

$str = 'abcde-da__123123213.xef';
$str2 = 'asdfasd__2342352353.gff';
$str3 = 'twethe__3242323423.pig';

Hiçbir şey şu __ (2 çizgi) değiştirmek istiyorum ve önce. Yeni bir dizeye (sayı) ile (nokta). Örneğin, 'ABCDE-da__23235239.xef' için yukarıdaki $str değişir.

Yollarından biri için

$temp = explode('.', $str); 
$temp2 = explode('__', $temp[0]);

ve

$new_str = $temp2[0].'__'.time().'.'.$temp[1];

Ama ben onun yerine preg_replace kullanmak eğer ben düşünüyordum ama ben regexs çok iyi değil

i preg_replace çalıştı (time (), 'abcde-da__123123213.xef' / __ (*) ​​/. ');

Bu regex, ya da başka herhangi bir kolay bir yol yazarken lütfen yardım edebilir?

Teşekkürler

2 Cevap

preg_replace('/(?<=__)([^.]+)(?=\.)/e','dosomething($1)',$str)

(?<=__) - LookBehind expression to match __
([^.]+) - Actual Match Part - match any characters except dot .
(?=\.)  - LookAhead expression to match .

e) /e kısmını, doSomething replace (php kodları kullanmak için izin verir de {time(), strtoupper(), gibi herhangi bir fonksiyonlar olabilir [(4)]} __ ve . arasındaki maç dizesi olacaktır

Regexes hakkında daha fazla bilgi için, regular-expressions.info bir göz atın lütfen

This regex is simpler: /.*?__(.*?)\..*/

".*" = kesinlikle bir şey. '?' O __ .*? kadar her şeyi eşleşen hangi sonuçları, açgözlü olmamak için araçlarını takip

"__" regex herhangi bir önemi yoktur, bu yüzden tam anlamıyla müzik Bahisler

"(.*?)" her şeyi tekrar maç ama açgözlü olmayın demektir. Bu numaraları maç olacak

Böylece regex motoru biz gerçek karakterini değil, "hiçbir şey" demek bilir "\." Biz dönem karakteri eşleştirmek istiyor, ama regex önemli bir karakter olduğu için, biz ondan kaçmak gerekir

".*" her şey maç. Biz umurumda kısmı geçmiş çünkü biz burada açgözlü olabilir

Yani ...

".*?__" matches everything before the number, and "\..*" matches everything after