2016-11-20 7 views
0

Ich habe folgende HTML:PHP Rückkehr mehr Übereinstimmungen gleiche RegexMuster

<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> 

Ich mag die Werte von Name, Phone und Email innerhalb derselben RegexMuster erfassen, so etwas wie:

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

Wenn ich es separat versuche, wie zum Beispiel:

es ist okay. Vielleicht verstehe ich nicht, wie REGEX funktioniert, ist es nicht möglich, mehr Übereinstimmungen in einem einzigen Muster zu haben?

+0

Parsing HTML-Markup mittels eines regulären Ausdrucks ist in der Regel kein guter Ansatz. Es ist sehr unzuverlässig und komplex. Sehen Sie sich stattdessen einen 'DOM-Parser' an. Das sind die richtigen Werkzeuge für solche Aufgaben. – arkascha

+0

Ich weiß, ich kann nicht DOM verwenden, weil meine Datei keine vollständigen HTML-Tags hat, nur TABLE und so weiter, so dass ich nicht auf DOM zugreifen kann. – bsteo

+0

Das bedeutet nicht, dass Sie keinen DOM-Parser verwenden können! Betten Sie diese Tabellendefinition einfach in ein minimalistisches HTML-Framework ein. – arkascha

Antwort

2

Beispiel für Multiline-Regex. 1. Nicht die beste Lösung für das Problem, sondern die Fähigkeit. 2. Nicht die beste Regex, aber der Punkt ist die s Flagge am Ende.

<?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]