2013-02-08 2 views
1

htmlentities로 인코딩 된 HTML 코드가있는 문자열이 있습니다.HTML 문자열의 모든 경로를 찾는 정규 표현식

HREF = "XXX"SRC = "XXX": 내가 원하는 무엇

사이, 문서의 모든 경로를 찾을 수 있습니다.

나는 모든 링크는 HTTP, HTTPS, FTP 및 파일에 의해 시작 찾기 정규식 표현을해야합니까, 나 그것을 반복하지 않도록 :

"/\b(?:(?:https?|ftp|file):\/\/|www\.|ftp\.)[-A-Z0-9+&@#\/%=~_|$?!:,.]*[A-Z0-9+&@#\/%=~_|$]/i" 

어떤 생각?

+6

왜'href = "'와 다음'''사이에 모든 것을 찾으려고하지 않습니까? * 많이 * 더 쉽고 * 적은 * 오류가 발생하기 쉬울 것입니다. – zerkms

+1

'href = "([^"] *) "'?가 URL에 허용됩니까? 나는 공간이 실제로는 ... –

+0

@P O'Conbhui :'''문자뿐만 아니라 공백이 허용되지 않는다고 생각합니다. – zerkms

답변

4

업데이트 : 정규식을 사용하는 것은 신뢰할 수 없습니다. src = ".."또는 href = ".."문은 주석 또는 javascript 문에 포함될 수 있습니다. 신뢰성이 링크를 얻으려면 내가 XPath를 사용하는 것이 좋습니다 것이다 : 나는 = href를 또는 SRC 속성의 " 사이의 컨텐츠를 잡기 위해 노력할 것이다

<?php 

$html = file_get_contents('http://stackoverflow.com/questions/14782334/regex-expression-to-find-all-paths-in-a-html-string/14782594#14782594'); 
$doc = new DOMDocument(); 
@$doc->loadHTML($html); 
$selector = new DOMXPath($doc); 

$result = $selector->query('//a/@href | //@src'); 
foreach($result as $link) { 
    echo $link->value, PHP_EOL; 
} 

정규식을 사용하는 경우. 다음은 그 예 정규식을 사용하여 에서이 페이지의 링크를 얻는 방법을 제공 :

<?php 

$html = file_get_contents('http://stackoverflow.com/questions/14782334/regex-expression-to-find-all-paths-in-a-html-string'); 

preg_match_all('/href="(?P<href>.*)"|src="(?P<src>.*)"/U', $html, $m); 
                 <--- note the U to make the 
                  pattern ungreedy 
var_dump($m['href']); 
var_dump($m['src']); 
4

당신은 특정 태그에있는 모든 링크를 찾기 위해 DOM을 사용할 수 있습니다. 예를 들어 앵커 태그에서 URL을 이런 식으로 뭔가 할 얻을 수 있습니다 (테스트되지 않은, 그러나 그것은 옳은 방향으로 당신을 가리켜 야) :

function findPaths($url) 
{ 
    $dom = new DOMDocument(); 

    //$url of page to search, the "@' is there to suppress warnings 
    @$dom->loadHTMLFile($url) 

    $paths = array(); 
    foreach($dom->getElementsByTagName('a') as $path) 
    { 
    $paths[] = array('url' => $path->getAttribute('href'), text => $path->nodeValue); 
    } 
    return $paths; 
} 

당신은로드하고 DOM을 평가하기 위해 XPath를 사용하여보다 쉽게 ​​만들 수 있습니다.

관련 문제