2012-08-13 4 views
1

콘텐츠의 URL을 쉽게 찾을 수있는 정규식이 있습니다. 목표는 "/ folder/id/123"과 같은 링크에서 폴더를 제거하고 "id/123"으로 바꾸는 것입니다. 따라서이 폴더는 동일한 폴더에서 상대적으로 짧습니다. Regex : negative assertion

는 사실은 내가
$pattern = "/\/?(\w+)\/id\/(\d)/i" 
$replacement = "id/$2"; 
return preg_replace($pattern, $replacement, $text); 

를하고 그것을 잘 작동하는 것 같다.

그러나 마지막 테스트는 동일한 패턴/folder/id/123을 사용하는 외부 사이트 인 경우 일치하는 각 URL이 http : //를 포함하지 않는지 테스트하는 것입니다.

나는/[^ http : //] 또는 (? <! html) ...과 다른 것들을 성공하지 못했습니다. 어떤 도움이라도 좋을 것입니다 :-)

$pattern = "/(?<!http)\b\/?(\w+)\/id\/(\d)/i"; ??????? 

고마워요! 여기

은 몇 가지 예입니다 :

(these should be replaced, "same folder" => short relative path only) 
<a href="/mysite_admin/id/414">label</a> ==> <a href="id/414">label</a> 
<a href="/mYsITe_ADMIN/iD/29">label with UPPERCASE</a> ==> <a href="id/414">label with UPPERCASE</a> 

(these should not be replaced, when there is http:// => external site, nothing to to) 
<a href="http://mysite_admin/id/414">label</a> ==> <a href="http://mysite_admin/id/414">label</a> 
<a href="http://www.google_admin.com">label</a> ==> <a href="http://www.google_admin.com">label</a> 
<a href="http://anotherwebsite.com/id/32131">label</a> ==> <a href="http://anotherwebsite.com/id/32131">labelid/32131</a> 
<a href="http://anotherwebsite_admin.com/id/32131">label</a> ==> <a href="http://anotherwebsite_admin.com/id/32131">label</a> 
+0

, 예를 제공하십시오. 당신의 작업은 간단하게 들리지만 검사 할 문자열을 볼 수 없다. – gaussblurinc

+0

하나의 정규식을 사용하여 url이 http와 다른 정규 표현식으로 시작하는지, PHP if 문 안에 있는지를 확인하기 위해 똑같은 일을 할 수있다. 바꿔 놓음. 글을 쓰고 이해하는 것이 더 쉽고, 복잡한 pcre는 아마도 더 효율적이지 않습니다. – Vortexfive

답변

1

단지 패턴으로 /^(?!http)\/?(\w+)\/node\/(\d)/i을 사용합니다 look-back 주장을 표시하는 데 사용되는 <에 대한 필요는, 그것이 일치하지 :-) 당신의 도움을 주셔서 감사합니다 당신을 대단히/foo는/바/123 있지만 http://www.google.com/foo/bar/123

this question는 미세 PHP 설명서에서이

+0

글쎄, http와의 링크가 더 이상 일치하지 않아서 고마워. 좋아! 마침내 그것은 일치하는 것이없는 것으로 보인다. - 나는 더 이상 교체 할 필요가 없다. 다행히 당신이 제공 한 링크를 통해 배우려고 노력할 것입니다. –

+0

음,'preg_replace ('/^(?! http) \ /? (\ w +) \/노드 \/(\ d)/i', 'id/$ 2', 'foo/node/123'); 'echo 'id/123'이 나에게 맞다. 이 패턴이 작동 할 때까지 [여기] (http://www.functions-online.com/preg_replace.html)를 테스트하고 돌아볼 수 있습니다. 또한, 나는 이것에 대해 신경 쓰지 않기를 바랍니다. 그러나 대답이 도움이되거나 문제를 해결 한 경우, upvote 또는 accept에 대한 사용자 정의입니다 ;-) –

0

와 함께 당신을 도울 수있는 좋은 개요를 제공합니다 - Assertions :

참고 분명히 유사한 패턴 바 "foo는"이외 앞에는 "바"의 발생을 발견하지 않습니다 (foo는가?!) (?! foo) 어설 션은 다음 세 문자가 "bar"일 때 항상 TRUE이기 때문에 은 "bar"의 어커런스를 찾습니다. 이 효과를 얻으려면 lookbehind 어설 션이 필요합니다.

같은 :

$pattern = "/(?<!http:\/)\/(\w+)\/id\/(\d)/i";