2010-03-10 82 views
1

我有一個字符串如何拆分和替換字符串?

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

我想替換任何下列__(2個下劃線)和前。 (點)與一個新的字符串(數字)。例如,上述$str更改爲'abcde-da__23235239.xef'。

的方式之一,是

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

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

但我想,如果我可以使用的preg_replace代替,但我不是在regexs

我嘗試了preg_replace(非常好'/__(.*)/',time(),'abcde-da__123123213.xef');

可以請你幫忙寫這個正則表達式,或任何其他更簡單的方法?

由於

回答

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

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

e/e允許使用PHP碼替換部,DoSomething的()也能像,time()strtoupper()$1將匹配字符串的任何功能__.

之間和有關正則表達式的更多信息,請看一看regular-expressions.info

+0

怎麼樣的解釋做什麼。這個人不理解正則表達式,所以這對他有幫助。 – 2010-03-10 13:14:38

+0

優秀..它的工作原理,我可以得到所需的字符串..但正則表達式部分只是頭頂上:D .. – user187580 2010-03-10 13:18:35

1

這種再gex更簡單: /.*?__(.*?)\..*/

.*」=絕對是任何東西。 '?'隨後手段不能貪心,這將導致.*?匹配一切都交給__

__」沒有在正則表達式任何意義,所以它的字面匹配

(.*?)」再次表示匹配的一切,但不要不要貪婪。這將匹配

\.」我們要句號字符匹配的數字,但因爲它是在正則表達式一個顯著的性格,我們需要這樣的正則表達式引擎知道我們指的是實際的字符,而不是「東西」

逃跑呢

.*」匹配任何東西。我們可以在這裏貪心,因爲我們過去,我們關心

所以部分...

.*?__」數量匹配之前的一切, 「\..*」匹配一切後,