2013-08-21 3 views
4

내 목표 :PHP 정규식

이 나에 문자열의 일부가되는 후행 슬래시없이, 슬래시 여부에 URL의 마지막 부분을 캡처하려면 비슷한 URL 다음

http://foo.com/p/dPWjiVtX-C/ 
       ^^^^^^^^^^ 
       The string I want 

내 문제 :

난 단지하려고 모든 방법은 후행 슬래시를 허용 아닌 URL의 끝에 슬래시없이 또는 흔적을 만든다 슬래시는 원하는 문자열에 포함되어야합니다.

무엇을 시도 했습니까?

내가 마지막에 슬래시를 추가하기 위해 노력했다 1 는 : 나는 후행 슬래시가없는 경우

$regex = "/.*?foo\.com\/p\/(.*)\//"; 
    if ($c=preg_match_all ($regex, $url, $matches)) 
    { 
    $id=$matches[1][0]; 
    print "ID: $id \n"; 
    } 

이 오류가 발생합니다.

2 나는 물음표를 추가하는 시도 :이 슬래시 결과

$regex = "/.*?foo\.com\/p\/(.*)[\/]?/"; 

있는 경우, 내 문자열 안에있는.

내 질문/TL; DR :

가 어떻게 슬래시를 필요로하지만 내 앞의 문자열에서 슬래시를 유지하지하기 위해 정규식을 구축 할 수 있습니다?

+1

이 BTW, 왜 ("/", $ URL을) 폭발 사용하지 :

당신은 사이트를 확인하는 대신 사용할 수 있습니까? 타겟이 될 배열의 마지막 값을 추출 할 수 있습니다. – palerdot

+0

사이트의 올바른 URL인지도 확인해야합니다. – Pachonk

+0

필요에 따라 후행 슬래시를 확인하고 추가하거나 제거 할 수 있습니다. – palerdot

답변

9

귀하의 .*는 기본적으로 욕심 : 그룹에 대한 순서로 슬래시 또는 문자열의 끝 (또는 다른 터미네이터를) 뒤에 당신의 ID를 캡처 그룹.

욕심을 없애려면 캡처 그룹에 .* 대신 .*?이 필요합니다.그래서, 당신의 정규식은 다음과 같습니다

$regex = "/^.*?instagram\.com\/p\/(.*?)[\/]?$/"; 
+0

비 탐욕스러운 물음표가 내 RegEx에서 내 ID를 전혀 포착하지 못하게하는 것으로 보입니다. – Pachonk

+0

아, 내 실수. 시작 문자와 끝 문자를 추가했습니다. – vroomfondel

+0

이 같은 문제를 해결하는 가장 실용적인 솔루션 인 것 같습니다. 그러나^및 $를 슬래시 바깥에 넣었습니다. – Pachonk

2
당신은 당신의 그룹에 후행 슬래시를 제외한 모든 문자를 캡처하려면이 옵션을 사용할 수 있습니다

: 당신이를 지정해야합니다

$regex = "/.*?instagram\.com\/p\/([^\/]*)/" 

또는 양자 택일로, 당신은 당신의 그룹이 아닌 욕심 한정 기호를 사용할 수 있습니다 이 캡처에 슬래시를 "먹을"수, 그래서 만약

$regex = "/.*?instagram\.com\/p\/(.*?)(?:\/|$)/" 
2

뭔가 당신은 아마 시도 할 수 있습니다 :

([^\/]+)\/?$ 

Demo on regex101

편집 : 허, 당신이 있기 때문에, 당신은뿐만 아니라 사이트를 확인해야 언급해야 당신은 첫 번째 예제 문자열에 foo.com을 넣었습니다. (그리고 그 후에 당신의 질문을 다시 편집했습니다 ...).

^.*foo\.com.*?([^\/]+)\/?$