2010-03-10 4 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이다를 사용할 수 있는지 생각했지만, 난 내가 preg_replace이다 시도

정규식 등에서 특정 요소를 뽑아 오기 (아주 좋은 아닌가요 '/__(.*)/', time(), 'abcde-da__123123213.xef');

이 정규식 또는 다른 간단한 방법을 작성 하시겠습니까?

감사 /e에서

답변

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

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

e은 부품을 교체에서, 해봐요()가 time(), strtoupper(), $1가 일치하는 문자열이 될 것 같은 어떤 기능이 될 수 PHP 코드를 사용할 수 있습니다 __ 사이 .

regexes에 대한 자세한 내용을 보려면 regular-expressions.info

+0

방법 그것이 무엇인지에 대한 설명. 그 사람은 정규식을 이해하지 못하기 때문에 그를 위해 도움이 될 것입니다. –

+0

우수 .. 작동하고 필요한 문자열을 얻을 수 있습니다 ..하지만 정규식 부분은 머리 위로 이동합니다 : D .. – user187580

1

이 re gex는 더 간단합니다 : /.*?__(.*?)\..*/

".*"= 절대적으로 무엇이든. '?'

는 "__은"정규 표현식에서 어떤 의미가없는 __하기 때문에 말 그대로

과 일치하는 것까지 그 모든 것을 일치 .*?에 어떤 결과 욕심하지 않는 방법을 다음과 " (.*?)는"다시 돈 제외한 모든 일치 의미 탐욕스럽지 않아. 이것은 숫자와 일치합니다

"\."우리는 마침표와 일치시키고 싶지만 정규 표현식에서 중요한 문자이므로 정규식 엔진이 "아무것도"가 아닌 실제 문자를 의미하도록 이스케이프 처리해야합니다

".*"과 일치합니다. 우리는 우리가 약

관심 부분을 지나서이기 때문에 우리는

".*?__"는 번호 앞에 모든 것을 일치하고 "\..*은"모든 것을 일치 ... 여기에 욕심이 될 수 후 약

관련 문제