2015-05-28 69 views
0

我試圖從符合特定模式的HTML中提取標籤。目前我使用:PHP正則表達式從html中提取<a>

$regexp = "<a\s[^>]*href=(\"??)([^\" >]*?[^\" >]*?)\\1[^>]*>(.*)<\/a>"; 
if(preg_match_all("/$regexp/siU", $html, $matches, PREG_SET_ORDER)) {...} 

哪個正確地得到所有的元素,但是我想要的3組(該鏈接的文本)包含文本「查找門票」,但我的所有嘗試合併文本(*)。沒有工作。此外,鏈接元素內部html可以包含超過「查找票」 - 也就是說它應該匹配在.*Find Tickets.*

有人可以幫助我在這裏,請我一直沒有得到這個。

更新: 我試圖抓住特定元素的一個例子:

<a href="https://www.facebook.com/l.php?u=https%3A%2F%2Fthelittleboxoffice.com%2Fheritagehotel%2Fevent%2Fview%2F22847&amp;h=RAQFYdp-K&amp;s=1" target="_blank" rel="nofollow" onmouseover="LinkshimAsyncLink.swap(this, &quot;https:\\/\\/thelittleboxoffice.com\\/heritagehotel\\/event\\/view\\/22847&quot;);" onclick="LinkshimAsyncLink.swap(this, &quot;https:\\/\\/www.facebook.com\\/l.php?u=https\\u00253A\\u00252F\\u00252Fthelittleboxoffice.com\\u00252Fheritagehotel\\u00252Fevent\\u00252Fview\\u00252F22847&amp;h=RAQFYdp-K&amp;s=1&quot;);"><div id="u_0_p">Find Tickets</div></a>< 

感謝 喬希

+0

你只是想要鏈接文本或'href'值,** **或整個'a'標籤? – hwnd

+1

您能否更新您的帖子以顯示您想要匹配的字符串以及您希望通過匹配獲得什麼? – Quixrick

+0

我主要是在href之後 - 鏈接文本本身是可選的(即,我不打算用它來做任何事情)。 – jb007

回答

1

用於作業的權利tool,而不是一個正則表達式。

$doc = new DOMDocument; 
@$doc->loadHTML($html); // load the HTML data 

$links = $xpath->query('//a[contains(., "Find Tickets")]'); 

foreach ($links as $link) { 
    $results[] = $link->getAttribute('href'); 
} 

print_r($results); 

eval.in

+0

如果你想鏈接文本,使用'$ link-> nodeValue;'... – hwnd

+0

謝謝,但我實際上開始用帽子的方法,但它不起作用,因爲我後面的元素實際上嵌入在html評論,所以正則表達式是這個工作更好的工具。 – jb007

+1

我不明白正則表達式是如何爲此提供更好的方法的,您可以使用XPath來實現此目的。 – hwnd

0

我仍然有一個小麻煩了解它究竟是什麼,你是後。雖然這是我最好的刺傷。

<?php 

$string = '<a href="https://www.facebook.com/l.php?u=https%3A%2F%2Fthelittleboxoffice.com%2Fheritagehotel%2Fevent%2Fview%2F22847&amp;h=RAQFYdp-K&amp;s=1" target="_blank" rel="nofollow" onmouseover="LinkshimAsyncLink.swap(this, &quot;https:\\/\\/thelittleboxoffice.com\\/heritagehotel\\/event\\/view\\/22847&quot;);" onclick="LinkshimAsyncLink.swap(this, &quot;https:\\/\\/www.facebook.com\\/l.php?u=https\\u00253A\\u00252F\\u00252Fthelittleboxoffice.com\\u00252Fheritagehotel\\u00252Fevent\\u00252Fview\\u00252F22847&amp;h=RAQFYdp-K&amp;s=1&quot;);"><div id="u_0_p">Find Tickets</div></a><'; 



if (preg_match('~(<a href(.*?)Find Tickets(.*?)</a>)~i', $string, $matches)) { 
    print "<PRE><FONT COLOR=ORANGE>"; print_r($matches); print "</FONT></PRE>"; 
} 

所有我真的這裏做的是尋找開始<a href其次的東西串,直到遇到Find Tickets,可能更多的東西,直到它擊中收盤</a>

這是一個非常普遍的正則表達式,但是如果你正在尋找更具體的東西,它可以構建出來。

編輯:

好了,從你的評論,我想我有你在找什麼更好的畫面。這是一個更新的REGEX,它將提取鏈接文本的匹配網址Find Tickets

<?php 

$string = ' 
<a href="http://www.google.com" style="color: blue;">Google</a> 

<a href="https://www.facebook.com/l.php?u=https%3A%2F%2Fthelittleboxoffice.com%2Fheritagehotel%2Fevent%2Fview%2F22847&amp;h=RAQFYdp-K&amp;s=1" target="_blank" rel="nofollow" onmouseover="LinkshimAsyncLink.swap(this, &quot;https:\\/\\/thelittleboxoffice.com\\/heritagehotel\\/event\\/view\\/22847&quot;);" onclick="LinkshimAsyncLink.swap(this, &quot;https:\\/\\/www.facebook.com\\/l.php?u=https\\u00253A\\u00252F\\u00252Fthelittleboxoffice.com\\u00252Fheritagehotel\\u00252Fevent\\u00252Fview\\u00252F22847&amp;h=RAQFYdp-K&amp;s=1&quot;);"><div id="u_0_p">Find Tickets</div></a> 

<a href="http://www.yahoo.com">Yahoo</a>'; 

if (preg_match('~<a href="(.*?)"(?:.*?)(?:(?=Find Tickets))(?:.*?)</a>~i', $string, $matches)) { 
    print "<PRE><FONT COLOR=ORANGE>"; print_r($matches); print "</FONT></PRE>"; 
} 

因此,這裏是這個表達式做什麼:

  • (.*?) - 這是真正抓住了URL,並將其存儲到$matches[1]的部分。
  • (?:.*?) - 這允許任何東西在URL後面,直到碰到下一個部分(向前看)。由於我們實際上並不需要此信息,?:告訴REGEX不要記住它找到的內容。
  • (?:(?=Find Tickets)) - 這是一個積極的暗示意義,爲了進行匹配,文本Find Tickets接下來。和前一項一樣,我們使用?:來告訴它它並不需要記住匹配。您可以在文本週圍加上HTML括號,以便進一步鎖定它,如果它匹配「找不到門票」之類的東西 - (?=>Find Tickets<)
  • (?:.*?) - 最後一部分與之前的相同,只是匹配任何東西直到關閉</a>標記。

從上面的$string,會給你這樣的:

Array 
(
    [0] => <a href="https://www.facebook.com/l.php?u=https%3A%2F%2Fthelittleboxoffice.com%2Fheritagehotel%2Fevent%2Fview%2F22847&amp;h=RAQFYdp-K&amp;s=1" target="_blank" rel="nofollow" onmouseover="LinkshimAsyncLink.swap(this, &quot;https:\/\/thelittleboxoffice.com\/heritagehotel\/event\/view\/22847&quot;);" onclick="LinkshimAsyncLink.swap(this, &quot;https:\/\/www.facebook.com\/l.php?u=https\u00253A\u00252F\u00252Fthelittleboxoffice.com\u00252Fheritagehotel\u00252Fevent\u00252Fview\u00252F22847&amp;h=RAQFYdp-K&amp;s=1&quot;);"><div id="u_0_p">Find Tickets</div></a> 
    [1] => https://www.facebook.com/l.php?u=https%3A%2F%2Fthelittleboxoffice.com%2Fheritagehotel%2Fevent%2Fview%2F22847&amp;h=RAQFYdp-K&amp;s=1 
) 

而且$matches[1]包含URL。

希望能爲您達到目標!

+0

謝謝,我試過了,但它似乎不止一次匹配文檔。只有一次發現查找門票,但我確實需要在一個組中的href值,因爲這將包括關閉後的文本「作爲組的一部分。我的原始正則表達式非常擅長拉出元素,但我需要它只能提取鏈接文本中也包含「查找票據」的元素 – jb007

+0

我想我現在明白了你在找什麼,我更新了我的帖子以反映這一點,希望它是你想要的。 – Quixrick