내가 문자열,문자열에서 바늘을 교체 한 후에 바꾸시겠습니까?
가 있습니까
bbbbabbbbbccccc 같은이가 나에게 "A" "C"로 하나의 편지 한 후 모든 문자 "B"를 대체 할 수있는 방법 않고 PHP를 사용하여 문자열을 분할하려면?
bbbbacccccccccc
내가 문자열,문자열에서 바늘을 교체 한 후에 바꾸시겠습니까?
가 있습니까
bbbbabbbbbccccc 같은이가 나에게 "A" "C"로 하나의 편지 한 후 모든 문자 "B"를 대체 할 수있는 방법 않고 PHP를 사용하여 문자열을 분할하려면?
bbbbacccccccccc
이상한 질문입니다.
echo preg_replace('/a(.*)$/e', "'a'.strtr($1, 'b', 'c')", 'bbbabbbbbccccc');
preg_replace는 'a'의 모든 부분을 정규식과 일치시킵니다. 정규 표현식의 e 수정자는 대체 문자열을 코드로 평가합니다. 대체 문자열의 코드는 strtr()을 사용하여 'b'를 'c'로 바꿉니다.
다음 세 가지 옵션이 있습니다.
먼저 분할. 예, 분할하지 않고 처리하기를 원합니다.
$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로 줄일 수 있습니다.
$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
수정자를 사용하지 않습니다. 그러한 제약 속에서 일하는 것을 스스로 알게 되더라도 알아두면 좋지만 첫 번째 휴양지가되어서는 안됩니다.
왜 문자열을 분할하지 않습니까? – Amber