페이지에서 링크를 찾으려고합니다.
내 정규식은 다음과 같습니다.
/<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 파서 를 사용하는 것이 좋습니다.
편집 : 테스트