ページ上のリンクを見つけようとしています。
私の正規表現は:
/<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;
}
上記は、$html
文字列内のすべてのA
要素の "outerHTML" を見つけて出力します。
getノードのすべてのテキスト値に、あなたは
echo $node->nodeValue;
checkhref
属性が存在する場合、実行できます
echo $node->hasAttribute( 'href' );
getするhref
属性
echo $node->getAttribute( 'href' );
changeするhref
属性
$node->setAttribute('href', 'something else');
removeする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
に一致し、任意の数のchar(貪欲でない).*?
が続き、その後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>/";
SimpleXMLを使用してソリューションを非常に簡単かつ迅速に取得できない場合
$a = new SimpleXMLElement('<a href="www.something.com">Click here</a>');
echo $a['href']; // will echo www.something.com
私のために働く
なぜあなたはちょうど一致しないのですか
"<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"
}
}
動作します。最初のキャプチャブレースを削除しました。
ここで何をしようとしているのかわかりませんが、リンクを検証しようとしている場合は、PHPのfilter_var()を見てください
本当に正規表現を使用する必要がある場合は、このツールを確認してください。 http://regex.larsolavtorvik.com/
クイックテスト:<a\s+[^>]*href=(\"\'??)([^\1]+)(?:\1)>(.*)<\/a>
はトリックを実行するようで、最初の一致は "または"、2番目は 'href'値、それは、3番目は 'what?'です。
「/」の最初の一致をそこに残した理由は、それを使用して後で「/」を閉じるために後方参照することができるため、同じです。
次のライブ例をご覧ください: http://www.rubular.com/r/jsKyK2b6do
preg_match_all( "/(]>)(.?)(</ a)/"、$ contents、$ impmatches、PREG_SET_ORDER);
テストされ、すべてのHTMLコードからすべてのタグを取得します。
以下は私のために働いており、アンカータグの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
と呼ばれる多次元配列には、使いやすい連想サブ配列が含まれています。