문제

이 스 니펫에 대한 조언이 필요합니다

$text = preg_replace('|(A.*)?A(.*)C|', '$1foo$2bar', $text);

이것은 "AB ABC D"에서 ABC와 일치하고이를 "AB FUOBBAR D"로 대체합니다. 보시다시피 이것은 처음에 "AB"부분과 일치합니다. 손실하지 않기 위해 1 달러로 교체 문자열에서 반복해야합니다.

이것이 그러한 결과를 얻는 가장 좋은 방법입니까?

그와 같은 깃발 x가 있습니까?

$text = preg_replace('|A(.*)C|X', 'foo$1bar', $text); 

동일한 결과를 생성합니까?

내가 분명했으면 좋겠다

고맙습니다!

편집하다: A, B, C는 임의의 문자의 원자 문자열로 고려하면 공백을 포함 할 수 있습니다.

또한, 제시된 예는 실제로 "ABC ABC"의 두 번째 "ABC"와 일치하기 때문에 실제로 버기입니다.

edit2: 죄송합니다. 아마도 문제를 매우 나쁘게 설명했을 것입니다. 요점은 내가 일치시키고 싶다는 것입니다 무엇이든 두 개의 a, c string 사이에 있으므로 매치에 Substring A가 없습니다.

다시 감사합니다

도움이 되었습니까?

해결책

질문이 명확 해지 면서이 표현을 시도하십시오.

preg_replace('/(?:A)+(.+?)(?:C)+/', 'foo$1bar', $text)

An example:

$A = 'abc'; $B = '123'; $C = 'xyz';
$text = "$A$B$C $A$A$B$C $A$B$C$C";
echo preg_replace("/(?:$A)+(.+?)(?:$C)+/", 'foo$1bar', $text);

다른 팁

이건 어때:

$text = preg_replace('|A(\S*)C|', 'foo$1bar', $text);

그만큼 \S 비 윈 스페이스 캐릭터와 일치하므로 다른 단어에 따라 대체하지 않습니다.


OP의 의견 중 일부를 본 후에는 또 다른 추측을 위험에 빠뜨릴 것입니다.

$text = preg_replace('|A(B)C|', 'foo$1bar', $text);

비 게리 버전의 The를 사용하십시오 * 수량 자 :

$text = preg_replace('|(.*)(A.*?C)|', '$1foo$2bar', $text);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top