2014-07-11 5 views

답변

4

(SKIP *) (* F) 바닥 창에서 대체 참조 the demo에서

$replaced = preg_replace('~"[^"]+"(*SKIP)(*F)|:D~', '^', $yourstring); 

마법.

이 문제는 기술의 고전적인 사례가 "regex-match a pattern, excluding..."

이 문제의 엔진이 문자열의 다음 위치로 건너 뜁니다 후 "quotes"| 일치 완료 교대의 왼쪽 후 의도적으로 실패를 설명한다. 그래서 따옴표는 중립입니다. 오른쪽은 :D과 일치하며 왼쪽에있는 표현과 일치하지 않기 때문에 올바른 것으로 알고 있습니다.

당신은 부정적 예측을 사용하고을 lookbehind 수

0

참조,

(?<!\"):D(?!\") 

과 일치하며 앞에는 " (큰 따옴표)가 붙지 않고 그 뒤에 "이옵니다. 그런 다음 일치하는 문자는 ^

<?php 
$string = ':D :D ":D" :D:D:D:D'; 
$pattern = "~(?<!\"):D(?!\")~"; 
$replacement = "^"; 
echo preg_replace($pattern, $replacement, $string); 
?> //=>^^ ":D" ^^^^ 

DEMO

로 대체