복붙노트

A 요소의 href 속성 가져 오기

PHP

A 요소의 href 속성 가져 오기

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

내 정규식은 :

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

그러나 실패로 보인다.

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

어떻게하면 정규식 태그를 href로 처리 할 수 ​​있습니까?

해결법

  1. ==============================

    1.

    신뢰할 수있는 HTML 용 정규 표현식은 어렵습니다. 다음은 DOM을 사용하는 방법입니다.

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

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

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

    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
    }
    

    참조 :

    sidenote에서 : 저는 이것이 중복 된 것이고 여기 어딘가에 답을 찾을 수 있다고 확신합니다.

  2. ==============================

    2.

    고든 (Gordon)에 동의합니다. HTML 파서를 사용하려면 반드시 HTML 파서를 사용해야합니다. 그러나 당신이 정말로 정규 표현식을 원한다면 이것을 시도 할 수 있습니다 :

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

    이것은 문자열의 시작 부분에있는

    $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"
    }
    
  3. ==============================

    3.

    찾으려는 패턴은 (뭔가)와 같이 링크 앵커 패턴이됩니다.

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

    4.

    왜 너는 일치하지 않는거야?

    "<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"
      }
    }
    

    어떤 작품. 방금 첫 번째 괄호를 제거했습니다.

  5. ==============================

    5.

    나는 당신이 여기서 무엇을하려고하는지 잘 모르겠다. 그러나 링크를 검증하려고한다면 PHP의 filter_var ()를 보라.

    정규 표현식을 사용하여이 도구를 체크 아웃해야한다면 다음과 같이하면 도움이 될 것입니다. http://regex.larsolavtorvik.com/

  6. ==============================

    6.

    귀하의 정규식을 사용하여, 나는 당신의 필요에 맞게 조금 그것을 수정했습니다.

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

    편집 : 테스트 됨

  7. ==============================

    7.

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

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

    나를 위해 일하는

  8. ==============================

    8.

    빠른 테스트 : ] * href = (\ "\ ') + ([^ \ 1] +) (? : \ 1)> (. *) <\ / a> 트릭, 첫 번째 경기는 "또는 ', 두 번째는'href '값'that ', 세 번째 경기는'무엇? '.

    내가 "/"의 첫 번째 경기를 떠난 이유는 그것을 닫는 "/"에 대해 나중에 역 참조하기 위해 사용할 수 있기 때문에 동일합니다.

    http://www.rubular.com/r/jsKyK2b6do에서 실시간 예제를 참조하십시오.

  9. ==============================

    9.

    preg_match_all ( "/(]>)(.?)(

    그것은 테스트 및 모든 HTML 코드에서 모든 태그를 가져옵니다.

  10. from https://stackoverflow.com/questions/3820666/grabbing-the-href-attribute-of-an-a-element by cc-by-sa and MIT lisence