2012-05-08 3 views
0

으로 문자열을 대체 나는이 같은 URL이 3 대신 2 개의 하위 URL이 있지만 작동하지 않습니다. 왜죠?preg_replace이다

+0

'http :'다음에'http : \/\ /'와'.com'과 모든'(\ w +)'다음에 슬래시를 피하는 것을 잊지 마시기 바랍니다. – Yaniro

답변

0

표현식이 제대로 인용되지 않은 정규식에서 특별한 의미를 가진 문자가 포함되어 있기 때문에이 제대로 작동하지 않습니다.

$url = 'http://Example.com/' 
$pattern = preg_quote($url.'{word}/{word}/{word}', '/'); 
$pattern = str_replace($pattern, '{word}', '(\w+)'); 
$pattern = "/$pattern/i"; 
$replacement = $url.'$2/$3'; 
$appUrl= preg_replace($pattern, $replacement, $appUrl); 

그렇지 않으면 잘못된 것들을 얻기 위해 단순히 너무 쉽게이 같은 preg_quote를 사용

100 % 확신합니다. 예를 들어, 모두은 현재 .Example.com (으)로 적절히 벗어나지 않기 때문에 현재 잘못된 답변입니다. 예를 들어 문자열과 같이 문자열을 입력하면이 문자열을 직접 테스트 할 수 있습니다. http://Example!com, 여기서 !은 원하는 문자 일 수 있습니다.

또한 큰 따옴표로 묶인 문자열 리터럴에 $2과 같은 문자열을 사용하고 있습니다. 이는 PHP에서 좋지 않습니다. 왜냐하면 IMHO는 쉽게 옮겨지기 때문입니다. 더 좋게 만드는 것은 단독으로 인용되고 안전합니다.

+0

답해 주셔서 감사합니다 –

+0

'(\ w +)'다음에'/'를 두지 않으시겠습니까? 따옴표가 너무 많다는 뜻입니까? 또는 나는 무엇인가 놓쳤는가? – Adam

+0

@ Adam : 아니요, 유죄입니다. 잡아 주셔서 감사 드리며'preg_quote '가 번거롭다는 것은 사실입니다. 그러나 돌로 캐스팅되지 않은 리터럴 (단순히 하드 코딩 된 것보다 더 강한 속성)의 경우 버그를 다르게 도입하는 것은 너무 쉽습니다. – Jon

3

패턴 내에서 슬래시를 이스케이프 처리하거나 다른 패턴 구분 기호를 사용해야합니다.

$pattern = '/http:\/\/Example\.com\/(\w+)\/(\w+)\/(\w+)/i';    

$pattern = '#http://Example\.com/(\w+)/(\w+)/(\w+)#i';    
+0

닫기,하지만 시가 없음 당신이 점을 빠져 나가는 것을 잊었 기 때문에. 이 작업을 수동으로 수행하고 그러한 버그를 도입 (또는 보유) 할 위험이 없습니다. 단지'preg_quote'를 사용하십시오. – Jon

+0

@ 존 합의, 예. 나는 점에서 이스케이프를 수정했습니다 (여전히 일치했을지라도). 개인적으로,'preg_quote'는 코드를 조금 더 읽을 수 없게하지만, 나는 당신의 요지를 보았다. – Adam

+0

수정을 위해 또 다른 +1을 누려보십시오 :) – Jon

0
은 다음과 같이 슬래시 탈출

:

$pattern = '/http:\/\/Example.com\/(\w+)\/(\w+)\/(\w+)/i';    
$replacement="http://Example.com/$2/$3"; 
$appUrl= preg_replace($pattern, $replacement, $appUrl);