2010-01-27 8 views
7

another user's question에 대한 답을 테스트 할 때 이해가 안되는 것을 발견했습니다. 문제는 모든 리터럴 \t\n\r 문자를 단일 공백으로 바꾸는 것이 었습니다.PHP 정규 표현식 패턴에 추가 백 슬래시가 필요합니다

지금, 나는 시도 첫 번째 패턴이었다 : 놀랍게도 작동하지 않았다

/(?:\\[trn])+/ 

. 나는 Perl에서 같은 패턴을 시도하고 잘 동작했다. - 놀랍게도 - 모두 작업

/(?:\\\\[trn])+/ 

또는

/(?:\\\[trn])+/ 

이러한 패턴 : 약간의 시행 착오 후에 나는 PHP가 같이 3 또는 4 백 슬래시 그 패턴이 일치하기 위해, 원하는 것을 발견했다. 이러한 추가 백 슬래시가 필요한 이유는 무엇입니까? 때문에

+1

펄 정규 표현식에 언어에 통합 트릭을해야한다. –

답변

12

당신은 정규식에 1을 대표하는 4 백 슬래시가 필요합니다

  • 2 백 슬래시는 문자열에서 이스케이프 취소에 사용된다 ("\\\\" -> \\)
  • 1 백 슬래시는 정규식 엔진 이스케이프 취소에 사용됩니다 (\\ -> \)
  • 는 PHP 문서에서

,

탈출 슬래시 될 것이다 다른 캐릭터

  • 1 백 슬래시가 \ 이스케이프 취소를 위해 사용되며, \\\[위한 1

따라서도 인쇄되고, 하나의 체류 \[는 ("\\\[" -> \\[) 잘못되어

  • 백 슬래시는 정규식 엔진에서 이스케이프 해제에 사용됩니다 (\\[ -> \[)
  • 예, 작동하지만 좋은 습관은 아닙니다.

    2

    정규식 입니다. 바로 /(?:\\[trn])+/입니다. 당신은뿐만 아니라 문자열 선언에서 백 슬래시를 이스케이프 할 필요가 있기 때문에 그러나, 각 백 슬래시 \\으로 표현되어야합니다 : PHP는 이스케이프 시퀀스 \[을 알고이를 무시하지 않기 때문에

    "/(?:\\\\[trn])+/" 
    '/(?:\\\\[trn])+/' 
    

    그냥 세 백 스페이스도 작동 않습니다. 따라서 \\\이되지만 \[\[입니다. 펄

    +0

    그런데 왜 3 개의 백 슬래시가 작동합니까? 그리고이 경우 작은 따옴표가 큰 따옴표와 다른 이유는 무엇입니까? –

    +0

    @kemp : 내 대답이 업데이트되었습니다. – Gumbo

    +0

    Gumbo :: 올바르게 이해했는지 알 수 있습니다.이 경우는'\ ['는 제어 문자가 아니기 때문에 작동합니다 ** ** 왼쪽에서 오른쪽으로 패턴이 분석되기 때문에 리터럴 열기 대괄호가되지 않습니다 그래서 백 슬래시는 그 앞에있는 하나에 붙어서 이전에 탈출 했습니까? –

    8

    그것의 작품을 직접 정규식 패턴으로 /(?:\\[trn])+/

    는하지만, PHP, 당신은 문자열로 전달할 필요가 통과하기 때문에, 그래서 백 슬래시 자체가 탈출 추가해야합니다.

    "/(?:\\\\[trn])+/" 
    

    정규식 \는 하나의 백 슬래시가 PHP preg string

    -2

    사용 않는 str_replace로 '/ \\\\ /'가 될 맞게! 당신은 단지 두 개의 백 슬래시가 필요하므로

    $code = str_replace(array("\t","\n","\r"),'',$code); 
    

    +1

    str_replace()는 요청 된 모든 문자 (많은 문자가 포함 된)를 작은 따옴표로 대체 할 수 없기 때문에이 질문에 대한 대답은 잘못되었습니다. 모두 제거 할 수 있습니다. –

    +0

    @kemp 예. \ r \ n 또는 \ n \ r 조합을 시도해도 제거되지 않으면 – AntonioCS

    +1

    아니요, 원하는 경우가 아니면 단 하나의 공백으로 대체 할 수 없습니다 (예 : 임의의 수). ** 가능한 모든 조합을 ** 제공하십시오. 코드가 수행하는 작업은 모두 제거하는 것입니다. –