2011-01-15 1 views

답변

1

이상한 질문입니다.

echo preg_replace('/a(.*)$/e', "'a'.strtr($1, 'b', 'c')", 'bbbabbbbbccccc'); 

preg_replace는 'a'의 모든 부분을 정규식과 일치시킵니다. 정규 표현식의 e 수정자는 대체 문자열을 코드로 평가합니다. 대체 문자열의 코드는 strtr()을 사용하여 'b'를 'c'로 바꿉니다.

1

다음 세 가지 옵션이 있습니다.

먼저 분할. 예, 분할하지 않고 처리하기를 원합니다.

$string = 'bbbbabbbbbccccc'; 
$parts = preg_split('/(a)/', $string, 2, PREG_SPLIT_DELIM_CAPTURE); 
// Parts now looks like: 
// array('bbb', 'a', 'bbbbcccc'); 
$parts[2] = str_replace('b', 'c', $parts[2]); 
$correct_string = join('', $parts); 

둘째, 위치 검색 및 부분 문자열 대체.

$string = 'bbbbabbbbbccccc'; 
$first_a_index = strpos($string, 'a'); 
if($first_a_index !== false) { 
// Now, grab everything from that first 'a' to the end of the string. 
    $replaceable = substr($string, $first_a_index); 
// Replace it. 
    $replaced = str_replace('b', 'c', $replaceable); 
// Now splice it back in 
    $string = substr_replace($string, $replaced, $first_a_index); 
} 

셋째, 나는 정규식을 게시하려고했지만, the one dqhendricks posted은 좋은 것입니다.

이 코드 예제는 명확하게하기 위해 자세한 내용을 담고 있으며, one-or-two-liners로 줄일 수 있습니다.

1
$s = 'bbbbabbbbbccccc'; 
echo preg_replace('/((?:(?!\A)\G|(?<!a)a(?!a))[^b]*)b/', '$1c', $s); 

\G은 이전 경기가 끝난 위치와 일치합니다. 첫 번째 일치 시도시 \G\A과 같은 문자열의 시작과 일치합니다. 우리는 그것을 원치 않으므로 (?!\A)을 사용합니다.

(?<!a)a(?!a)a 앞에 붙지도 뒤에도없는 a와 일치합니다. a은 그룹 # 1에서 캡처되므로 $1으로 교체 할 수 있습니다.

이것은 "순수 정규식"솔루션입니다. 즉, preg_replace을 호출 할 때 전체 작업을 수행하며 포함 코드와 /e 수정자를 사용하지 않습니다. 그러한 제약 속에서 일하는 것을 스스로 알게 되더라도 알아두면 좋지만 첫 번째 휴양지가되어서는 안됩니다.

관련 문제