2016-10-28 6 views
0

에 트림 기능의 일부 문자를 방지하는 방법. 나는 그것을 방지 할 수있는 방법

$str = trim($str, '"'); 

그러나 모든 따옴표를 트리밍, 그래서 아무도 말해 줄 수? 어쨌든 나는 내 자신의 트림 기능을 작성했지만 PHP에서 표준 API 함수를 사용하고자합니다.

+2

'preg_replace'가 당신이 찾고있는 것입니다. 먼저 정규 표현식을 작성해보십시오. 걸린 경우, 시도한 내용을 자세히 질문하십시오. –

+0

트림 기능은 어떻게 생겼습니까? 여기에 같은 해결책을 얻지 않으려면 ... – jeroen

+0

간단한 방법은 문자열의 마지막 기호가 백 슬래시 인 경우 모든 따옴표를 잘라내어 다시 추가하는 것입니다. 어쨌든, 정규식을 사용하면 훨씬 더 깨끗합니다. – ByteHamster

답변

2

아주 좋아, 나는 물 것이다. 당신이 사용해야하는 것은 정규식에서 부정적인 lookbehind입니다. 표현은, 그것의 가장 간단한 형태로 다음과 같이 보일 것이다 :

/(?<!\\)"/ 

내역 :

  • (?<! : 부정적인 lookbehind. 즉, 표현식이 이 아닌지, \\) : 특정 패턴이 뒤에 오는인지 확인하고 싶다는 의미입니다. 이 경우 패턴은 리터럴 \이 앞에 오지 않는 경우에만 일치합니다.
  • " : A 리터럴 ". 다시 말하지만, lookbehind 때문에 이스케이프 된 큰 따옴표는 일치하지 않습니다. 귀하의 경우에는 demo

, 당신은 아마 찾고 :

$str = preg_replace('/(?<!\\)"/', '', $str); 

은 빈 문자열 (기본적으로 그들을 제거)로 이스케이프되지 않은 모든 " 교체.


trim을 사용하고 있기 때문에 앞과 뒤 따옴표 만 제거 할 수 있습니다. 이 경우, 당신은 식을 단지 작은 비트를 변경해야하고,이를 사용합니다 :

/(?<!\\)(^"|"$)/ 

내역 :

  • (?<!\\) : 이전과 동일 (부정 lookbehind)
  • (^"|"$) : 리터럴 "과 여전히 일치하지만 문자열의 시작 또는 끝인 경우에만 해당합니다.

은 물론, 당신은 정말 최고의 견적에 대한 lookbehind을 필요로하지 않기 때문에이 표현은 좋은 (그렇지 않으면 더 나은) 작동합니다

/(^"|(?<!\\)"$)/ 

내역 :

  • ^" : 이스케이프 처리되지 않은 " 인 경우 문자열의 첫 번째 문자와 일치합니다.
  • (?<!\\) :
  • "$ 예전의 부정적인 Lookbehind는 : 그것이 부정적인 lookbehind 당 같은 \ 앞에 아니에요 경우에만 문자열 (의 끝에서 이러한 정규 표현식의

모두의 허용됩니다 따옴표를 일치 이 같은 문자열을 처리하는 :

$str = '"foo"bar\""'; 
echo preg_replace('/(^"|(?<!\\)"$)/', '', $str); 

출력을 foo"bar\"

Demo II

+0

정규식이 작동하고 있는지, 제 경우에 null을 제공하고 있습니까? –

+0

@KshitijYelpale : 정규 표현식이 예상대로 작동하는 것으로 보이는 2 개의 데모 링크를 추가했습니다. –

0

부정적인 lookbehind로 regex replace를 시도하십시오. 이런 표현은 속임수를 써야합니다 :

(?<!\\)"