2013-04-10 44 views
0

我有以下標籤的多個實例的HTML頁面中提取標籤的最有效的方法:從多個字符串

<INCLUDEFILE-1-/var/somepath/file1.php> 
<INCLUDEFILE-2-/var/somepath/file2.php> 
<INCLUDEFILE-3-/var/somepath/file3.php> 
<INCLUDEFILE-4-/var/somepath/file4.php> 
<INCLUDEFILE-5-/var/somepath/file5.php> 

可以使用哪些代碼提取所有上述的路徑?我迄今得到了下面的代碼,但不能讓它正常工作:

preg_match_all('/INCLUDEFILE[^"]+/m', $html, $result, PREG_PATTERN_ORDER); 

for ($i = 0; $i < count($result[0]); $i++) 
{ 
    $includefile = $result[0][$i]; 
} 

我需要提取:

/var/somepath/file1.php 
/var/somepath/file2.php 
/var/somepath/file3.php 
/var/somepath/file4.php 
/var/somepath/file5.php 

任何人都可以看到明顯的錯誤(S)?

+2

你真的是說'FILEINCLUDE'在你的正則表達式,而不是'INCLUDEFILE' – 2013-04-10 18:44:52

+0

?感謝羅伯特指出了這一點......我會糾正和澄清 – Alex 2013-04-10 18:48:39

回答

0

你可以這樣來做:

$html = ' 
    <INCLUDEFILE-1-/var/somepath/file1.php>fadsf 
    asdfasf<INCLUDEFILE-2-/var/somepath/file2.php>adsfaf 
    <INCLUDEFILE-3-/var/somepath/file3.php>asdfadsf 
    <INCLUDEFILE-4-/var/somepath/file4.php> 
    <INCLUDEFILE-5-/var/somepath/file5.php> 
'; 

$lines = explode(PHP_EOL, $html); 
$files = array(); 

foreach($lines as $line) 
{ 
    preg_match('/<INCLUDEFILE-\d+-(.+?)>/', $line, $match); 
    if(!empty($match)) { 
     $files[] = $match[1]; 
    } 
} 

var_dump($files); 
+0

將它們放在數組中會很好,但是因爲它們可能因頁面而異,所以我正在尋找一個更靈活的方法...答案可能在使用你的preg_match我會嘗試! – Alex 2013-04-10 18:58:43

1

我稍微改變了你的正則表達式,並添加括號來捕捉你所需要的子模式。我沒有在發佈的例子中看到引號(「),所以我改爲檢查」>「來檢測結束。我還添加了ungreedy修飾符,你可以嘗試它是如何使用或不使用ungreedy。 [1]其中將包含第一個子模式匹配

preg_match_all('/<INCLUDEFILE-[0-9]+-([^>]+)>/Um', $html, $result, PREG_PATTERN_ORDER); 

for ($i = 0; $i < count($result[1]); $i++) 
{ 
    $includefile = $result[1][$i]; 
} 
+0

(+1)爲m修飾符 – 2013-06-13 00:55:11

2

的捷徑就能幸福。

$pattern = '`<INCLUDEFILE-\d+-\K/[^>\s]+`'; 
preg_match_all($pattern, $subject, $results); 
$results=$results[0]; 
print_r($results);