2016-09-23 3 views
1

반복되는 단어로 구성된 문자열이 있습니다. 'L3'과 'L4'사이에있는 부분 문자열 'OK'를 바꾸려고합니다. 당신이 내 코드를 찾을 수 아래 : 내가는 preg_match와 그 패턴을 사용하는 경우preg_replace의 도움으로 부분 문자열을 바꾸는 방법

$search = "/(?<=L3).*(OK).*(?=L4)/"; 
$replace = "REPLACEMENT"; 
$subject = "'L1' => ('Vanessa', 'Prague', 'OK'), 'L2' => ('Alex', 'Paris', 'OK'), 'L3' => ('Paul', 'Paris', 'OK'), 'L4' => ('John', 'Madrid', 'OK')"; 
$str = preg_replace($search, $replace, $str); 

을, 그것은 올바른 문자열을 (세번째 'OK') 찾습니다. 그러나 해당 패턴을 preg_replace에 적용하면 괄호로 묶은 하위 패턴 대신 전체 패턴과 일치하는 하위 문자열을 대체합니다.

내 코드에서 변경해야 할 내용을 알려주십시오. 정규식에 대해 비슷한 양의 질문이 많이 있다는 것을 알고 있지만 패턴이 정확하고 preg_replace 함수와 혼동 스럽습니다.

답변

1

정규 표현식은 앞의 문자열에서 일치하는 것이 사실입니다 L3 다음 줄 바꿈 기호 이외의 0 + 문자 다음에 마지막으로 OK 하위 문자열이 포함 된 다음 039 개의 문자가있는 곳까지 일치합니다 (L4). your regex demo을 참조하십시오. 어떤 L3.5 없을 경우

$search = "/(L3.*?)OK(.*?L4)/"; 
$replace = "REPLACEMENT"; 
$subject = "'L1' => ('Vanessa', 'Prague', 'OK'), 'L2' => ('Alex', 'Paris', 'OK'), 'L3' => ('Paul', 'Paris', 'OK'), 'L4' => ('John', 'Madrid', 'OK')"; 
$str = preg_replace($search, '$1'.$replace.'$2', $subject); 
echo $str; // => 'L1' => ('Vanessa', 'Prague', 'OK'), 'L2' => ('Alex', 'Paris', 'OK'), 'L3' => ('Paul', 'Paris', 'REPLACEMENT'), 'L4' => ('John', 'Madrid', 'OK') 

PHP demo

참조 :

가능한 용액 전과 OK 후 서브 패턴 약 2 포착기를 사용하고, 여분의 패턴으로 역 참조를 사용하는 L3L4 사이에 (L3.*?)OK(.*?L4) 패턴을 사용하는 것이 안전합니다. L3과 일치하고 첫 번째 OK까지 줄 바꿈 이외의 0 개 이상의 문자가 일치하면 OK과 일치하고 첫 번째 L4까지 0 개 이상의 문자가 일치하고 캡처됩니다. 더 L4이 없을 경우

L4 순서를 시작하지 않는 LINEBREAK 기호 이외의 기호와 일치하는 (?:(?!L4).)* 강화 욕심 토큰을 사용

'~(L3(?:(?!L4).)*)OK~' 

regex demo

참고를 참조하십시오 : 정규 표현식을 더 안전하게하려면 패턴 내부에 'L# 주위에 추가하십시오.

관련 문제