A 요소의 href 속성 가져 오기


114

페이지에서 링크를 찾으려고합니다.

내 정규식은 다음과 같습니다.

/<a\s[^>]*href=(\"\'??)([^\"\' >]*?)[^>]*>(.*)<\/a>/

그러나 실패한 것 같다

<a title="this" href="that">what?</a>

a 태그에서 먼저 배치되지 않은 href를 처리하기 위해 정규식을 어떻게 변경합니까?

답변:


208

HTML에 대한 신뢰할 수있는 정규식은 어렵습니다 . DOM을 사용 하는 방법은 다음과 같습니다 .

$dom = new DOMDocument;
$dom->loadHTML($html);
foreach ($dom->getElementsByTagName('a') as $node) {
    echo $dom->saveHtml($node), PHP_EOL;
}

위는 문자열 에있는 모든 요소 의 "outerHTML" 을 찾아 출력 합니다.A$html

노드의 모든 텍스트 값 을 얻으 려면 다음을 수행하십시오.

echo $node->nodeValue; 

하려면 확인 경우 href속성은 당신이 할 수있는

echo $node->hasAttribute( 'href' );

하려면 얻을href 당신이 할 거라고 속성을

echo $node->getAttribute( 'href' );

하기 위해 변경href 속성을 당신이 할 것

$node->setAttribute('href', 'something else');

하려면 제거href 당신이 할 거라고 속성을

$node->removeAttribute('href'); 

XPath 를 사용하여 href직접 속성을 쿼리 할 수도 있습니다.

$dom = new DOMDocument;
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$nodes = $xpath->query('//a/@href');
foreach($nodes as $href) {
    echo $href->nodeValue;                       // echo current attribute value
    $href->nodeValue = 'new value';              // set new attribute value
    $href->parentNode->removeAttribute('href');  // remove attribute
}

참조 :

사이드 노트에서 : 이것이 중복이라고 확신 하며 여기 어딘가에서 답을 찾을있습니다.


HTML 구문 분석을위한 신뢰할 수있는 정규식은 HTML이 일반 언어가 아니기 때문에 본질적으로 불가능합니다.
Asciiom

19

저는 Gordon에 동의합니다. HTML 구문 분석을 위해 반드시 HTML 구문 분석기를 사용해야합니다. 그러나 정규식을 정말로 원한다면 이것을 시도해 볼 수 있습니다.

/^<a.*?href=(["\'])(.*?)\1.*$/

이것은 <a문자열의 시작 부분에서 일치 하고 그 뒤에 임의의 문자 (비 욕심)가 .*?href=따르고 그 뒤에 "또는 또는'

$str = '<a title="this" href="that">what?</a>';
preg_match('/^<a.*?href=(["\'])(.*?)\1.*$/', $str, $m);
var_dump($m);

산출:

array(3) {
  [0]=>
  string(37) "<a title="this" href="that">what?</a>"
  [1]=>
  string(1) """
  [2]=>
  string(4) "that"
}

정보를 위해 : 표현식 (. *?)보다 많은 요소가 포함 된 텍스트에서 검색하면 잘못된 것입니다.
Michal-wereda-net 2014

5

찾고자하는 패턴은 다음과 같은 링크 앵커 패턴입니다.

$regex_pattern = "/<a href=\"(.*)\">(.*)<\/a>/";

1
앵커에 더 많은 속성이 있으면 어떻게됩니까?
funerr

3

그냥 맞추지 그래

"<a.*?href\s*=\s*['"](.*?)['"]"

<?php

$str = '<a title="this" href="that">what?</a>';

$res = array();

preg_match_all("/<a.*?href\s*=\s*['\"](.*?)['\"]/", $str, $res);

var_dump($res);

?>

그때

$ php test.php
array(2) {
  [0]=>
  array(1) {
    [0]=>
    string(27) "<a title="this" href="that""
  }
  [1]=>
  array(1) {
    [0]=>
    string(4) "that"
  }
}

작동합니다. 방금 첫 번째 캡처 중괄호를 제거했습니다.


2
사용시 preg_match_all("/<a.*?href\s*=\s*['\"](.*?)['\"]/", $str, $res, PREG_SET_ORDER);모든 href 값을 올바르게 잡기 위해 사용 하는 것이 좋습니다foreach($res as $key => $val){echo $val[1]}
Ignacio Bustos 2013 년

3

여전히 SimpleXML을 사용하여 매우 쉽고 빠르게 솔루션을 얻지 못하는 분

$a = new SimpleXMLElement('<a href="www.something.com">Click here</a>');
echo $a['href']; // will echo www.something.com

나를 위해 일해


2

여기서 무엇을 하려는지 잘 모르겠지만 링크를 확인하려는 경우 PHP의 filter_var ()

정말 정규 표현식을 사용해야한다면이 도구를 확인하십시오. http://regex.larsolavtorvik.com/


2

정규식을 사용하여 필요에 맞게 약간 수정했습니다.

<a.*?href=("|')(.*?)("|').*?>(.*)<\/a>

개인적으로 HTML 파서 를 사용하는 것이 좋습니다.

편집 : 테스트


myregextester.com 사용-죄송합니다. 링크를 찾을 수 없습니다.
bergin

그것은 말한다 : 일치하지 않습니다. 구분자 충돌을 확인하십시오.
bergin

일치시킬 텍스트를 말씀해 주시겠습니까? 나는 사용 :<a title="this" href="that">what?</a>
Ruel

1

빠른 테스트 : <a\s+[^>]*href=(\"\'??)([^\1]+)(?:\1)>(.*)<\/a>첫 번째 일치는 "또는 ', 두 번째는'href '값'that ', 세 번째는'what? '으로 트릭을 수행하는 것 같습니다.

내가 거기에 "/ '의 첫 번째 일치를 남긴 이유는 나중에 닫는"/'에 대해 역 참조하는 데 사용할 수 있으므로 동일합니다.

http://www.rubular.com/r/jsKyK2b6do 에서 라이브 예제보기


1
@bergin 지정하십시오, 작동하지 않는 것은 무엇입니까? 테스트 HTML의 href에서 정확한 값을 얻습니다. 이것이하지 않을 것으로 기대하는 것은 무엇입니까? 테스트를 위해 다른 사이트를 사용하는 것을 보았습니다. 또한 귀하의 예제에서 'href'값을 성공적으로 얻었습니다. myregextester.com/?r=d966dd6b
CharlesLeaf

0

preg_match_all ( "/ (] >) (. ?) (</ a) /", $ contents, $ impmatches, PREG_SET_ORDER);

테스트를 거쳐 모든 html 코드에서 모든 태그를 가져옵니다.


0

다음은 저와 반환 모두 노력 href하고 value앵커 태그의.

preg_match_all("'\<a.*?href=\"(.*?)\".*?\>(.*?)\<\/a\>'si", $html, $match);
if($match) {
    foreach($match[0] as $k => $e) {
        $urls[] = array(
            'anchor'    =>  $e,
            'href'      =>  $match[1][$k],
            'value'     =>  $match[2][$k]
        );
    }
}

라는 다차원 배열 $urls에는 이제 사용하기 쉬운 연관 하위 배열이 포함되어 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.