2014-04-04 2 views
1

나는 다음 코드있어하지 :정규 표현식 온라인 테스트 도구에서 작업하지만, 내 응용 프로그램에

$file = '/mnt/stoneshare/cache/video/10_12_101_38/000/011/M00001.mp4'; 

preg_match('/[\/\\](\d+_\d+_\d+_\d+)[\/\\]/', $file, $matches); 

var_dump($matches); 

어떤, 분명히, 생산 :

preg_match(): Compilation failed: missing terminating ] for character class at offset 27

을 그러나 온라인 테스트 도구에서 동일한 예제를 실행하면 it works.

무엇이 문제입니까?

답변

3

그냥 탈출을 추가

preg_match('/[\/\\\](\d+_\d+_\d+_\d+)[\/\\\]/', $file, $matches); 
//  here __^  and   __^ 
+0

예, 작동합니다. 그러나 왜 그런가? 그것은 부정확 해 보입니다. 역 슬래시를 피한 다음 브래킷을 이스케이프 처리하고, IDE에서 이런 식으로 구문 강조 표시를하는 것처럼 말입니다. 그리고 네,이 도구에 대한 온라인 도구 오류가 있습니다. – jolt

+0

@ jolt : 나는이 행동의 진짜 이유를 모른다. 예를 들어'[\/\\\] '가 실수 인 다른 언어에서는 perl과 다릅니다. – Toto

+1

@jolt [here] (http://stackoverflow.com/a/18017821)의 설명 – HamZa

0

나는이 시도 것 :

preg_match('/^\/.*(\d+_\d+_\d+_\d+)\/.*$/', $file, $matches); 
+0

이것은 OP가 원하는 것과 일치하지 않습니다. – Toto

+0

어떻게 그렇게? 그가 (\ d + _ \ d + _ \ d + _ \ d +) 부분을 원하는 것처럼 보입니다. – pokero

+0

그는 분리 문자가 슬래시'/'또는 백 슬래시 '\'가되기를 원합니다. 또한 숫자는 분리 기호 사이에 있습니다 (어떤 문자도 선행하지 않습니다). 그리고 왜'. * $'를 끝에 붙이십니까? – Toto

1

당신은 당신의 패턴으로 하나 더 백 슬래시를 추가해야합니다.

preg_match('/[\/\\\](\d+_\d+_\d+_\d+)[\/\\\]/', $file, $matches); 

백 슬래시는 특수 문자는 그 자체이기 때문에

, 당신은 표현식에서 문자를 포함 할 경우 다른 백 슬래시 (\)로 이스케이프해야합니다. 더구나 역 슬래시 다음에 오는 문자가 PHP에서 이스케이프 된 문자로 간주되기 때문에 백 슬래시 (\\)를 추가해야합니다. 휴!