답변:
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"
}
}
작동합니다. 방금 첫 번째 캡처 중괄호를 제거했습니다.
preg_match_all("/<a.*?href\s*=\s*['\"](.*?)['\"]/", $str, $res, PREG_SET_ORDER);
모든 href 값을 올바르게 잡기 위해 사용 하는 것이 좋습니다foreach($res as $key => $val){echo $val[1]}
여기서 무엇을 하려는지 잘 모르겠지만 링크를 확인하려는 경우 PHP의 filter_var ()
정말 정규 표현식을 사용해야한다면이 도구를 확인하십시오. http://regex.larsolavtorvik.com/
빠른 테스트 : <a\s+[^>]*href=(\"\'??)([^\1]+)(?:\1)>(.*)<\/a>
첫 번째 일치는 "또는 ', 두 번째는'href '값'that ', 세 번째는'what? '으로 트릭을 수행하는 것 같습니다.
내가 거기에 "/ '의 첫 번째 일치를 남긴 이유는 나중에 닫는"/'에 대해 역 참조하는 데 사용할 수 있으므로 동일합니다.
http://www.rubular.com/r/jsKyK2b6do 에서 라이브 예제보기
다음은 저와 반환 모두 노력 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
에는 이제 사용하기 쉬운 연관 하위 배열이 포함되어 있습니다.