A 요소의 href 속성 가져 오기 같습니다. /<a\s[^>]*href=(\”\’??)([^\”\’ >]*?)[^>]*>(.*)<\/a>/ 그러나 실패한

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

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

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

그러나 실패한 것 같다

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

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



답변

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
}

참조 :

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


답변

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

답변

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

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

답변

그냥 맞추지 그래

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

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


답변

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

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

나를 위해 일해


답변

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

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


답변

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

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

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

편집 : 테스트