2014-03-07 6 views
1

이 여기에 까다로운 질문을 가진 문자열의 2 차 발생으로 1 차 발생을 내가 뭘하려고 오전되어 교체 는 preg_match와 지금 456abc의 그것은 내가 좋아하는 (123)와 ABC 방송의 첫 번째 항목을 교체하는 것이 가능하다이PHP는 x와 y

preg_replace('/abc/', '123', $str, 1); 

그러나 두 번째 발생을 456으로 바꾸는 방법과 가장 중요한 방법을 한꺼번에 수행하고 필요한 문자열 (예 : 123 def 456)을 생성하는 방법.

참고 : 문자열은 외부 소스에서 생성됩니다.

감사 아마르

+0

게다가 'preg_replace ('/ abc/','123 ', $ str, 1); preg_replace ('/ abc /', '456', $ str, 1);'...'preg_replace_callback()'각 카운트에 기반하여 응답을 수정할 수있는 콜백 함수를 사용합니다. –

답변

5

당신 매우 가까웠다 : 2 정규식의 선두로부터는, 실제로 2 항목이기 때문에

$str = preg_replace('/abc/', '123', $str, 1); // will replace first 'abc' 
$str = preg_replace('/abc/', '456', $str); // will replace all others 

이 작동하는 이유가있다.
프로 : 매우 읽기, 이해하고
을 구현하는 것은 매우 쉬운 : 문자열이 당신이 무엇을하지 않으면 옵션


를 제한됩니다, (큰 문자열에 대한 나쁜)를 두 번 regexed됩니다 많은 변종이 만들어 질 수있는 많은 더 많은 제어 O를 : 당신이 preg_replace_callback()

$firstHasBeenFound = false; 
function magicFunction($matches){ 
    global $firstHasBeenFound; 
    print_r($matches); 
    if(!$firstHasBeenFound){ 
     /* do something for the first time */ ; 
     $firstHasBeenFound = true; // save for next round 
    } 
    else{ 
     /* do something for the test */ ; 
    } 
} 

$str = preg_replace_callback('/abc/', 'magicFunction', $str); 

프로 사용할 수 있습니다 원하는 버전 코드,
문자열의 한 구문 분석 : 읽기 어려운/I가 $firstHasBeenFound 사용이 예에서

구현,하지만 당신은 이상형을 찾을 때 당신이 뭔가 각각 2, 또는 뭔가를 할 수있는 증가를 사용할 수 있습니다 7 등은

+0

Err. 왜'preg_replace_callback'이 존재할 때 해킹을 사용합니까? – Leri

+0

하하, 나는 그 업데이트를 위해 노력하고 있었다. – Martijn

+0

권자. 왜 나는 그것에 대해 생각하지 않았다. 그래서 바보 같은 –

2

하나 이것에 대해?

$str = preg_replace('/abc(.*?)abc/', '123${1}456', $str, 1); 
+1

나는이 아이디어가 마음에 들지만, 더 큰 정규 표현식을 사용하면 엉망이된다.그러나 작은 대체물의 경우, 이것은 매우 좋을 것입니다. – Martijn

+0

@Martijn 그래, 가능할 것이다. $ 1에 그룹을 보유해야하므로 최악의 경우 무거울 것입니다! –

0
$str="abc def abc ghi abc"; 
$replacements = array('123', '456'); 

$str = preg_replace_callback(
    '/abc/', 
    function ($matches) use ($replacements) { 
     static $counter = 0; 
     $returnValue = $matches[0]; 
     if (isset($replacements[$counter])) 
      $returnValue = $replacements[$counter]; 
     $counter++; 
     return $returnValue; 
    }, 
    $str 
); 

var_dump($str); 
0

당신은 콜백으로 closurepreg_replace_callback를 사용할 수 있습니다 방법 (PH에서 작동 P 5.3+).

$str = "abc def abc abc def abc"; 
$a_replc = array('123', '456'); 
$n = 0; 
$str = preg_replace_callback('/abc/', function() use (&$n, $a_replc) { 
    return $a_replc[$n++ % count($a_replc)]; 
}, $str);