2012-01-14 3 views
1

문자 앞에 홀수 또는 백 슬래시가 있는지 어떻게 확인할 수 있습니까? PHP는 단일 및 이중 백 슬래시도 동일하게 간주합니다! 아래 코드를보고하십시오 :단일 및 이중 백 슬래시의 차이점

$str = "\a\\b\\\c"; 
echo preg_replace("/\\\/", "+", $str); // +a+b++c 
echo preg_replace("/\x{005c}/u", "+", $str); // +a+b++c 

echo strlen($str); // 7 
for($i=0; $i<strlen($str); $i++) 
    echo bin2hex($str{$i}).', '; 
// Output: 5c, 61, 5c, 62, 5c, 5c, 63 

나는 그 문자를 확인하려면 이스케이프 여부되었습니다! "\\", " \"


어떻게이 두 문자열 사이의 차이를 확인하려면? 은 date() 함수와 유사합니다.

감사합니다,

답변

1

\a\\a와 동일 할 수도 있지만, \n 확실히 \\n와 동일하지 않습니다. 다음 문자가있는 백 슬래시가 특수 시퀀스로 해석되면 백 슬래시는 이스케이프 문자로 작동합니다. 그렇지 않으면 백 슬래시는 단지 백 슬래시입니다.

+0

date() 함수와 같이 구문 분석하는 방법은 무엇입니까? 홀수 백 슬래시가 짝수 백 슬래시와 동일하지 않다는 의미입니다. – AHHP

+0

문자열 리터럴 구문과 문자열 내용을 다르게해야합니다. @dgunchev는 \\는 \에 대한 이스케이프 시퀀스이므로 '\ a \ b \\ c'이고'\ a','\ b' 및'\ c'는 유효한 이스케이프 시퀀스가 ​​아니기 때문에 – Amadan

1

문자열이 실제로 \a\b\\c - \a이 아니므로 \a이됩니다. 그러나 \n인데 차이점을 확인하십시오.

+0

사실 저는 백 슬래시를 이스케이프 처리하고 싶습니다. date() 함수를 다시 작성하십시오. 그래서 문자열을 파싱하고 이상하고 심지어 백 슬래시로 뭔가를 다르게해야합니다. – AHHP

+0

여기에 오게 될지 모르겠지만 일을 더 간단하게하기 위해 코드에 포함시키지 말고 텍스트 파일에서 한 줄씩 말하여 입력 내용을 읽으십시오. PHP 인터프리터를 삽입 할 때 먼저 백 슬래시를 처리합니다. 또는 시도하십시오 : $ str = $ bsl. ' ... –

1

짧은 대답은 당신이 정규식으로는 할 수 없다는 것입니다. 이를 보장하는 데 필요한 가변 길이 룩 어 헤드 어설 션을 수행 할 수 없습니다. 나는 한 번만 서브 패턴 (subpatterns)으로 최적화 된 그런 문자열을 찾는 훌륭한 일을 한 정규 표현식을 만들었지 만 때때로 많은 양의 일치가 발생했을 때 버퍼 오버플로 및 스크립트 충돌을 일으킬 수있었습니다.

strcspn()에서 확인하십시오. 커스텀 파싱 기능을 작성하는 데 아주 좋습니다. 정지 문자로 \을 사용할 수 있습니다. 그런 다음 다음 캐릭터와 함께 특별한 행동을 취하거나 행동하지 않으면 앞서 행동하십시오. 정규 표현식보다 빠르게 실행됩니다.