2013-10-30 60 views
1

我是新的正則表達式。帶正則表達式的搜索鏈接

我有這樣的文字:

$text = 
'<ul style="list-style:none;"> 
    <li> 
     <a href="files/docs/qwe.xls" target="_blank">Link1</a> 
    </li> 
    <li> 
     <a href="files/docs/ere.xls" target="_blank">Link2</a> 
    </li> 
    <li> 
     <a href="files/docs/123.xls" target="_blank">Link3</a> 
    </li> 
</ul>'; 

用正則表達式我想要得到這個數組:

$filePath[0] = "files/docs/qwe.xls"; 
$fileName[0] = "Link1"; 
$filePath[1] = "files/docs/ere.xls"; 
$fileName[1] = "Link2"; 
$filePath[2] = "files/docs/123.xls"; 
$fileName[2] = "Link3"; 

我該怎麼辦呢?

謝謝。

+0

理想的情況是不應該使用正則表達式,甚至在文中絲毫變化解析HTML會往往會弄亂你的正則表達式。 請看看這個http://stackoverflow.com/questions/3577641/how-do-you-parse-and-process-html-xml-in-php – ffledgling

回答

0

使用

$res = array(); 
preg_match_all('/href="(.+?)".*?>(.+?)<\/a>/ims', $text, $res); 
var_dump($res); 
+0

@Robert:爲什麼要先定義$ res? – TiMESPLiNTER

+0

因爲它會給出未定義數組的錯誤,所以聲明要使用的變量是一件好事。順便說一句,你的代碼將失敗,多行 – Robert

+0

但$ res被preg_match_all定義,並且不會拋出php錯誤,即使啓用E_ALL error_reporting()。多線不是要求。 – TiMESPLiNTER

0

使用lookarounds,他們是爲了檢查是否有東西之前,或者你正在尋找的字符串後非常有用。下面是它如何工作的:

/(?<=href=")[^"]*(?=")/ 

這裏的意思是這樣:

/開始
(?<=href=")前面加href="
[^"]*其次"
/"字符
(?=")的任何nomber end

2

你需要簡單的正則表達式

檢查這個代碼

$match = array(); 
preg_match_all('#<a href="(.*?)">(.*?)</a>#sm', $text, $match); 
print_r($match) 

(.*?) - 意味着一切非貪婪

+0

@TiMESPLiNTER did the op write that uppercase is needed? It's just about adding "i" to "#sm" :) – Robert

+0

Yeah I know but you wrote in my answer that my code is not working with multiline and this was nod needed either bei the op an his example. So I thought I'll complete your answer too. – TiMESPLiNTER