2016-11-20 16 views
0

我有以下HTML:PHP回報倍數匹配相同的正則表達式模式

<tr valign="top"> 
     <td>Name:</td> 
     <td>John Doe</td> 
</tr> 
<tr><td colspan="2">&nbsp;</td></tr> 
<tr valign="top"> 
     <td>Address:</td> 
     <td>71 view st, Fitchburg, MA 01420</td> 
</tr> 
<tr><td colspan="2">&nbsp;</td></tr> 
<tr valign="top"> 
     <td>Phone:</td> 
     <td>978-345-5391</td> 
</tr> 
<tr><td colspan="2">&nbsp;</td></tr> 
<tr> 
     <td>Email:</td> 
     <td>[email protected]</td> 
</tr> 

我想捕捉同一正則表達式中的NamePhoneEmail的價值觀,是這樣的:

$pattern = "/Name:<\/td>\s*<td>(.*)<\/td>.*Address:<\/td>\s*<td>(.*)<\/td>.*card ([0-9].*)<\/td>/m"; 

如果我單獨嘗試,如:

$pattern = "/Name:<\/td>\s*<td>(.*)<\/td>/m"; 
$pattern = "/Phone:<\/td>\s*<td>(.*)<\/td>/m"; 
$pattern = "/Email:<\/td>\s*<td>(.*)<\/td>/m"; 

沒關係。也許我不明白REGEX是如何工作的,在單一模式下不可能有更多的匹配?

+0

由正則表達式的裝置解析HTML標記通常是不是一個好方法。這是非常不可靠和複雜的。改爲查看「DOM解析器」。這些是這種任務的正確工具。 – arkascha

+0

我知道,我不能使用DOM,因爲我的文件沒有任何完整的HTML標籤,只有TABLE等,所以我無法訪問DOM。 – bsteo

+0

這並不意味着你不能使用DOM解析器!簡單地將表格定義嵌入到簡約的HTML框架中。 – arkascha

回答

2

示例顯示多行正則表達式。 1.不是問題的最佳解決方案,但說明能力。 2.不是最好的正則表達式,但最後的標誌是s

<?php 
$html = <<<EOL 
<tr valign="top"> 
     <td>Name:</td> 
     <td>John Doe</td> 
</tr> 
<tr><td colspan="2">&nbsp;</td></tr> 
<tr valign="top"> 
     <td>Address:</td> 
     <td>71 view st, Fitchburg, MA 01420</td> 
</tr> 
<tr><td colspan="2">&nbsp;</td></tr> 
<tr valign="top"> 
     <td>Phone:</td> 
     <td>978-345-5391</td> 
</tr> 
<tr><td colspan="2">&nbsp;</td></tr> 
<tr> 
     <td>Email:</td> 
     <td>[email protected]</td> 
</tr> 
EOL; 

$pattern = "#Name:</td>.*<td>(.*?)</td>.*Address:</td>.*<td>(.*?)</td>.*Phone:</td>.*<td>(.*?)</td>.*Email:</td>.*<td>(.*?)</td>#s"; 

if(preg_match($pattern, $html, $matches)) { 
    printf("Name: %s\n", $matches[1]); 
    printf("Address: %s\n", $matches[2]); 
    printf("Phone: %s\n", $matches[3]); 
    printf("Email: %s\n", $matches[4]); 
} 


?> 

Yeilds

Name: John Doe 
Address: 71 view st, Fitchburg, MA 01420 
Phone: 978-345-5391 
Email: [email protected]