回答:
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パーサーを使用する必要があります。しかし、本当に正規表現が必要な場合は、これを試すことができます:
/^<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>
1つ目の一致が "または"、2番目は "href"値、 "3つ目"、3つ目は "何ですか?"でトリックを実行するようです。
「/」の最初の一致をそこに残した理由は、それを使用して、後で「/」を閉じるためにそれを後方参照して、同じにすることができるためです。
次のライブ例をご覧ください: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
は、使いやすい連想サブ配列が含まれています。