2013-10-16 81 views
-2

我想用正則表達式從HTML文件中提取多個URL。 HTML代碼如下所示:任何人都可以幫我解決我的正則表達式問題嗎?

<h1 class="article"><a href="http://www.domain1.com/page-to-article1" onmousedown="return(...) 
<h1 class="article"><a href="http://www.domain2.com/page-to-article2" onmousedown="return(...) 
<h1 class="article"><a href="http://www.domain3.com/page-to-article3" onmousedown="return(...) 
<h1 class="article"><a href="http://www.domain3.com/page-to-article4" onmousedown="return(...) 

我想只有<h1 class="article"><a href="" onmousedown="return(...)例如之間提取URL http://www.domain1.com/page-to-article1,http://www.domain2.com/page-to-article2, http://www.domain3.com/page-to-article3

+4

[問]是一個很好的指南。你的Q的答案在這裏:http://stackoverflow.com/a/1732454 – brasofilo

+1

'DOMDocument' with'DOMXPath',query for'// h1 [@ class ='article']/a/@ href' – Wrikken

回答

3

正如已經回答和評論,你不應該使用regexes這個任務。但是,如果你真的堅持下來,你可以使用這個表達式:

/\<h1 class="article"\>\<a href="([^"]*)" onmousedown="return/ 

創建這個正則表達式的演練:

  1. 那麼,什麼是你真正想要?像這樣的行:

    <h1 class="article"><a href="http://www.domain1.com/page-to-article1" onmousedown="return 
    
  2. 但是,在正則表達式中不允許某些字符。在這個例子中,<>字符是非法的。因此,你應該逃避他們,通過在非法字符前面添加一個反斜槓(\):

    \<h1 class="article"\>\<a href="http://www.domain1.com/page-to-article1" onmousedown="return 
    
  3. 這隻會匹配中已有的正則表達式的URL。我們想匹配任何網址。一般來說,在這種情況下,網址如何顯示?這很難說,因爲URL以許多不同的形式存在。

    一個簡單的描述是:一個URL是一串不包含"字符的文本(因爲這會結束<a>標記的href屬性)。在正則表達式中,這將是[^"]:它匹配除"以外的任何字符。

    我們還沒有做完一件事:一個URL不僅僅是一個字符,除了",還有一大堆字符。因此,我們在模式([^"])中添加一個星號(*),該模式匹配零個或多個字符。這導致[^"]*。現在可以匹配任何長度的網址。

    我們不應該忘記,我們實際上是想從文本中獲取URL(而不僅僅是匹配/檢測它)。通過定義一個組,組的內容將分別返回。您可以通過將模式置於括號中來定義一個組。結果:([^"]*)

    現在,我們可以代入我們開始與模式這一點:

    \<h1 class="article"\>\<a href="([^"]*)" onmousedown="return 
    
  4. 一個我們應該做的最後一件事就是告訴正則表達式處理器,我們是否要匹配整行(即只找到結果如果我們的模式匹配整條線)或部分線。我們選擇後者。要做到這一點,我們把斜線模式:

    /\<h1 class="article"\>\<a href="([^"]*)" onmousedown="return/ 
    
  5. 在最後一步,我們可以添加改性劑。這些就像正則表達式處理器在匹配模式時使用的首選項。我們添加i改性劑,使圖案不區分大小寫:

    /\<h1 class="article"\>\<a href="([^"]*)" onmousedown="return/i 
    

我建議看看一個regex cheat sheet並嘗試瞭解正在發生的事情正則表達式。將它添加到您的書籤(或打印它)。每當你遇到一個正則表達式或者需要一個正則表達式時,嘗試使用它。如果你對他們不熟悉,正則表達式看起來像是很難的魔法,但如果你學會自己正確使用正則表達式非常方便。


實施例使用:

<?php 

$html = <<<EOF 
<h1 class="article"><a href="http://www.domain1.com/page-to-article1" onmousedown="return(...) 
<h1 class="article"><a href="http://www.domain2.com/page-to-article2" onmousedown="return(...) 
<h1 class="article"><a href="http://www.domain3.com/page-to-article3" onmousedown="return(...) 
<h1 class="article"><a href="http://www.domain3.com/page-to-article4" onmousedown="return(…) 
EOF; 

preg_match_all('/\<h1 class="article"\>\<a href="([^"]*)" onmousedown="return/i', $html, $matches); 

print_r($matches[1]); 
// Array 
// (
//  [0] => http://www.domain1.com/page-to-article1 
//  [1] => http://www.domain2.com/page-to-article2 
//  [2] => http://www.domain3.com/page-to-article3 
//  [3] => http://www.domain3.com/page-to-article4 
//) 

?> 
+0

非常感謝喬納森! :) – Kris

相關問題