2012-03-28 3 views
1

문자열의 기존 URL을 확인하는 함수가 필요합니다.대부분의 URL과 일치하는 정규식 정규식이 필요합니다.

function linkcleaner($url) { 
$regex="(?i)\b((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))"; 

if(preg_match($regex, $url, $matches)) { 
echo $matches[0]; 
} 
} 

정규 표현식은 그가 모든 URL과 일치하는 정규 표현식을 작성하는 문제가 해결 된 John Gruber's blog에서 가져옵니다. 불행히도, 나는 그것을 작동하게 만들 수 없습니다. 문제는 표현식의 끝 부분에있는 정규식 또는 다른 문장 부호 안에있는 큰 따옴표에서 오는 것 같습니다. 도움을 주시면 감사하겠습니다. 감사합니다.

+10

"그것이 작동되도록 할 수 없습니다)

이가 네, 한 - 라이너 아니다 (이 시도)하지만 이해하기 쉬운하고 필요한 경우 수정, 읽기/... 수정 "내장 된 PHP 오류가 아닙니다. 메시지. –

+2

@JackManey, roflmao –

+0

죄송합니다. "Parse error : 구문 오류, 예기치 않은 오류 ','C : \ ... \ config.php on line ..."오류가 발생했습니다. 영어는 모국어가 아니며 때로는 내가하고 싶은 말을 설명하는 데 문제가 있습니다. – olegb3

답변

2

@ tandu의 답변 외에도 PHP 정규 표현식의 구분 기호가 필요합니다.

그 문자가 표시되지 않는 가장 쉬운 시작과 #와 패턴을 종료하는 것입니다 :

$regex="#(?i)\b((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'\".,<>?«»“”‘’]))#"; 
+0

"#"URL의 일부일 수 있습니다 (앵커 지정)를 사용하여 구분을 내 대답을 편집했습니다 ... – poncha

+0

감사합니다! 어떻게 내가 그걸 놓칠 수 있겠습니까? 내 하루를 구 했어요. – olegb3

+0

@poncha이 정규 표현식 패턴에 나타나지 않고 그게 유일한 문제입니다. – jeroen

3

당신은 \

1

잭 Maney의 코멘트 ... EPIC와 " 탈출해야합니다 당신이 중간에 문자열 리터럴 권리를 종료하기 때문에 D

더 심각한 주에를 작동하지 않습니다 .

문자열에 큰 따옴표 ( ")를 포함하려면, 당신은 그래서 \

을 사용하여 탈출해야 라인이

$regex="/(?i)\b((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'\".,<>?«»“”‘’]))/"; 

공지 될 것입니다 나는 ('를) 탈출을 게다가. 그것은 두 개의 작은 따옴표 사이에 문자열을 정의 할 때 사용됩니다.

+0

감사합니다 & @tandu 여전히 오류가 발생합니다 경고 : preg_match() [function.preg-match] : 알 수없는 수정 기호 '\'in C : \ wamp \ www \ ... \ config.php on line 919 – olegb3

+0

PHP에서 시작과 끝에서 동일한 문자로 정규 표현식을 구분해야한다고 생각하십시오. 나는// –

1

을 나는 그것이에 진짜 고통의 원인, 너희들이 정규식을 읽는 방법을 잘 모르겠습니다

<?php 
$re_proto = "(?:https?|ftp|gopher|irc|whateverprotoyoulike)://"; 
$re_ipv4_segment = "[12]?[0-9]{1,2}"; 
$re_ipv4 = "(?:{$re_ipv4_segment}[.]){3}".$re_ipv4_segment; 
$re_hostname = "[a-z0-9_]+(?:[.-][a-z0-9_]+){0,}"; 
$re_hostname_fqdn = "[a-z0-9_](?:[a-z0-9_-]*[.][a-z0-9]+){1,}"; 
$re_host = "(?:{$re_ipv4}|{$re_hostname})"; 
$re_host_fqdn = "(?:{$re_ipv4}|{$re_hostname_fqdn})"; 
$re_port = ":[0-9]+"; 
$re_uri = "(?:/[a-z0-9_.%-]*){0,}"; 
$re_querystring = "[?][a-z0-9_.%&=-]*"; 
$re_anchor = "#[a-z0-9_.%-]*"; 
$re_url = "(?:(?:{$re_proto})(?:{$re_host})|{$re_host_fqdn})(?:{$re_port})?(?:{$re_uri})?(?:{$re_querystring})?(?:{$re_anchor})?"; 

$text = <<<TEXT 
http://www.example.com 
http://www.example.com/some/path/to/file.php?f1=v1&f2=v2#foo 
http://localhost.localdomain/ 
http://localhost/docs/??? 
www....wwhat? 
www.example.com 
ftp://ftp.mozilla.org/pub/firefox/latest/ 
Some new Mary-Kate Olsen pictures I found: the splendor of the Steiner Street Picture of href… http://t.co/tJ2NJjnf 
TEXT; 

$count = preg_match_all("\01{$re_url}\01is", $text, $matches); 
var_dump($count); 
var_dump($matches); 
?> 
+0

당신의 대답은 greate입니다! 그것은 다음 문자열을 올바르게 구문 분석하는 유일한 정규식입니다 :'RT @JustBrelieve : "@ enn4xor : #TBT 지난 여름. * _ * http://t.co/LsasKwfe"you 귀엽고, 귀엽다.' – Oleg

+0

나는'$ re_hostname_fqdn' 매개 변수 몇 가지 문제를 발견했습니다. 그것은'메리 - 케이트 (Mary-Kate) '를'내가 발견 한 메리 - 케이트 올슨의 새로운 사진들 중 일부와 일치시킵니다 : http : // t.co/tJ2NJjnf' – Oleg

+0

@Oleg'$ re_hostname_fqdn'은 일치 할 것입니다. 메리 케이트 (Mary-Kate)는 가능한 호스트 이름이기 때문에 (어쨌든 ...), 왜 프로토 타입과 어울리지 않는지 알 수 있습니다. 고마워서 고마워요. – poncha

관련 문제