我有以下正則運算式來查找以“Kontakt”作為錨文本的錨標記:
#<a.*href="[^"]*".*>Kontakt<\/a>#
這是要從中查找的字串:
<li class="item-133"><a href="/webdesign-tipps" title="Wissenswertes zu Webdesign, Grafikdesign oder Onlinemarketing">Wissenswertes</a></li><li class="item-115"><a href="/webagentur" >Webagentur</a></li><li class="item-257"><a href="/team" >Team</a></li><li class="item-116 menu-parent"><a href="/support" >Support<span class="menu-toggler"></span></a></li><li class="item-350"><a href="/jobs" >Jobs</a></li><li class="item-120"><a href="/kontakt" >Kontakt</a></li></ul>
所以結果應該是:
<a href="/kontakt" >Kontakt</a>
但我得到的結果是:
<a href="/webdesign-tipps" title="Wissenswertes zu Webdesign, Grafikdesign oder Onlinemarketing">Wissenswertes</a></li><li class="item-115"><a href="/webagentur" >Webagentur</a></li><li class="item-257"><a href="/team" >Team</a></li><li class="item-116 menu-parent"><a href="/support" >Support<span class="menu-toggler"></span></a></li><li class="item-350"><a href="/jobs" >Jobs</a></li><li class="item-120"><a href="/kontakt" >Kontakt</a>
這是我的 PHP 代碼:
$pattern = '#<a.*href="[^"]*".*>Kontakt<\/a>#';
preg_match_all($pattern, $string, $matches);
uj5u.com熱心網友回復:
如果您可以相信您的輸入將始終包含<a href在每個錨標記中,請嘗試:
'#<a href="[^"]*"[^>]*>Kontakt<\/a>#';
// Instead of what you have:
'#<a.*href="[^"]*".*>Kontakt<\/a>/#';
.*是“通配符”元字符.和“零次或多次”量詞*一起。
.*匹配任何東西任意次數。
試試看https://regex101.com/r/qxnRZv/1
uj5u.com熱心網友回復:
您正在使用preg_match_all(),所以我假設您愿意接收多個符合條件的錨標簽。使用合法的 DOM 決議器決議有效的 HTML 總是比等效的正則運算式技術更穩定且更易于閱讀。依賴正則運算式進行 DOM 決議并不是一個好主意,因為正則運算式是“不知道 DOM 的”——它只匹配看起來像 HTML 物體的東西。
在 XPath 查詢中,搜索<a>將限定字串作為整個文本的標記(存在于檔案中的任何深度)。
代碼:(演示)
$html = <<<HTML
<li ><a href="/webdesign-tipps" title="Wissenswertes zu Webdesign, Grafikdesign oder Onlinemarketing">Wissenswertes</a></li><li ><a href="/webagentur" >Webagentur</a></li><li ><a href="/team" >Team</a></li><li ><a href="/support" >Support<span ></span></a></li><li ><a href="/jobs" >Jobs</a></li><li ><a href="/kontakt" >Kontakt</a></li></ul>
HTML;
$dom = new DOMDocument;
libxml_use_internal_errors(true);
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$result = [];
foreach ($xpath->query('//a[text() = "Kontakt"]') as $a) {
$result[] = $dom->saveHtml($a);
}
var_export($result);
輸出:
array (
0 => '<a href="/kontakt">Kontakt</a>',
)
使用正則運算式是否更簡潔?是的,但它對于一般用途也不太可靠。
您會注意到 DOMDocument 還會自動清除標記中不必要的間距。
uj5u.com熱心網友回復:
你的正則運算式:
...a.*href...
是貪心的,意思是:“在a之后,在href之前匹配盡可能多的字符”。這會導致您的正則運算式回傳多個 href。
您可以使用惰性模式運算子?:
...a.*?href....
這意味著“在a之后,在href之前匹配盡可能少的字符”。它應該作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/451641.html
