Regex yang andal untuk HTML itu sulit . Berikut ini cara melakukannya dengan DOM :
$dom = new DOMDocument;
$dom->loadHTML($html);
foreach ($dom->getElementsByTagName('a') as $node) {
echo $dom->saveHtml($node), PHP_EOL;
}
Di atas akan mencari dan mengeluarkan "outerHTML" dari semua A
elemen di$html
string.
Untuk mendapatkan semua nilai teks dari node, Anda melakukannya
echo $node->nodeValue;
Untuk memeriksa apakah href
atribut tersebut ada, Anda dapat melakukannya
echo $node->hasAttribute( 'href' );
Untuk mendapatkan yang href
atribut Anda akan melakukan
echo $node->getAttribute( 'href' );
Untuk mengubah yang href
atribut Anda akan melakukan
$node->setAttribute('href', 'something else');
Untuk menghapus satu href
atribut yang akan Anda lakukan
$node->removeAttribute('href');
Anda juga dapat menanyakan href
atribut secara langsung dengan XPath
$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
}
Lihat juga:
Di samping itu: Saya yakin ini adalah duplikat dan Anda dapat menemukan jawabannya di suatu tempat di sini
Saya setuju dengan Gordon, Anda HARUS menggunakan pengurai HTML untuk mengurai HTML. Tetapi jika Anda benar-benar menginginkan regex, Anda dapat mencoba yang ini:
Ini cocok
<a
di awal string, diikuti dengan sejumlah karakter apa pun (tidak serakah).*?
laluhref=
diikuti dengan tautan yang dikelilingi oleh salah satu"
atau'
Keluaran:
sumber
Pola yang ingin Anda cari adalah pola tautan tautan, seperti (sesuatu):
sumber
kenapa kamu tidak cocok saja
kemudian
yang berhasil. Saya baru saja melepas kawat gigi penangkap pertama.
sumber
preg_match_all("/<a.*?href\s*=\s*['\"](.*?)['\"]/", $str, $res, PREG_SET_ORDER);
untuk menangkap dengan benar semua nilai href dalam menggunakanforeach($res as $key => $val){echo $val[1]}
Untuk orang yang masih belum mendapatkan solusi dengan sangat mudah dan cepat menggunakan SimpleXML
Ini bekerja untuk saya
sumber
Saya tidak yakin apa yang Anda coba lakukan di sini, tetapi jika Anda mencoba memvalidasi tautan, lihat filter_var () PHP
Jika Anda benar-benar perlu menggunakan ekspresi reguler, periksa alat ini, ini mungkin membantu: http://regex.larsolavtorvik.com/
sumber
Menggunakan regex Anda, saya memodifikasinya sedikit agar sesuai dengan kebutuhan Anda.
<a.*?href=("|')(.*?)("|').*?>(.*)<\/a>
Saya pribadi menyarankan Anda menggunakan HTML Parser
EDIT: Diuji
sumber
<a title="this" href="that">what?</a>
Tes cepat:
<a\s+[^>]*href=(\"\'??)([^\1]+)(?:\1)>(.*)<\/a>
tampaknya berhasil, dengan kecocokan pertama adalah "atau ', yang kedua adalah' nilai 'href' itu ', dan yang ketiga adalah' apa? '.Alasan saya meninggalkan kecocokan pertama "/ 'di sana adalah karena Anda dapat menggunakannya untuk mereferensikannya nanti untuk penutupan" /' sehingga sama.
Lihat contoh langsung di: http://www.rubular.com/r/jsKyK2b6do
sumber
preg_match_all ("/ (] >) (. ?) (</ a) /", $ content, $ impmatches, PREG_SET_ORDER);
Ini diuji dan mengambil semua tag dari kode html apa pun.
sumber
Berikut ini bekerja untuk saya dan mengembalikan keduanya
href
danvalue
dari tag jangkar.Array multidimensi yang disebut
$urls
sekarang berisi sub-array asosiatif yang mudah digunakan.sumber