Frage

Ich versuche, einen regulären Ausdruck zu machen für einige Daten aus einer Tabelle unter.

der Code ich habe jetzt ist:

<table>
   <tr>
     <td>quote1</td>
     <td>have you trying it off and on again ?</td>
   </tr>
   <tr>
     <td>quote65</td>
     <td>You wouldn't steal a helmet of a policeman</td>
   </tr>
</table>

Das habe ich ersetzt werden soll durch:

quote1: haben Sie es aus und wieder versuchen,

quote65: Sie würden keinen Helm eines Polizisten stehlen

der Code, den ich schon geschrieben habe, ist dies:

%<td>((?s).*?)</td>%

Aber jetzt bin ich stecken.

War es hilfreich?

Lösung

Tims Regex wahrscheinlich funktioniert, aber Sie können mit der DOM-Funktionalität von PHP statt regex betrachten wollen, wie es zuverlässiger sein kann im Markup mit geringfügigen Änderungen im Umgang.

Siehe die loadhtml Methode

Andere Tipps

Wenn Sie wirklich wollen, reguläre Ausdrücke zu verwenden (vielleicht in Ordnung sein, wenn Sie wirklich, wirklich sicher, dass die Zeichenfolge sind, werden immer so formatiert werden), was so etwas wie dies in Ihrem Fall:

$str = <<<A
<table>
   <tr>
     <td>quote1</td>
     <td>have you trying it off and on again ?</td>
   </tr>
   <tr>
     <td>quote65</td>
     <td>You wouldn't steal a helmet of a policeman</td>
   </tr>
</table>
A;

$matches = array();
preg_match_all('#<tr>\s+?<td>(.*?)</td>\s+?<td>(.*?)</td>\s+?</tr>#', $str, $matches);

var_dump($matches);

Ein paar Worte über die regex:

  • <tr>
  • dann eine beliebige Anzahl von Leerzeichen
  • dann <td>
  • dann, was Sie erfassen möchten
  • dann </td>
  • und das gleiche wieder
  • und schließlich </tr>

Und ich benutze:

  • ? in der Regex in nicht-gierigen Modus
  • übereinstimmen
  • preg_match_all erhalten alle Spiele

Sie erhalten dann die gewünschten Ergebnisse in $matches[1] und $matches[2] (nicht $matches[0]) ; hier ist der Ausgang der var_dump I verwendet (I entfernen habe Eintrag 0, um es kürzer) :

array
  0 => 
    ...
  1 => 
    array
      0 => string 'quote1' (length=6)
      1 => string 'quote65' (length=7)
  2 => 
    array
      0 => string 'have you trying it off and on again ?' (length=37)
      1 => string 'You wouldn't steal a helmet of a policeman' (length=42)

Sie brauchen dann nur dieses Array zu manipulieren, mit einigen Strings Verkettung oder dergleichen; zum Beispiel wie folgt aus:

$num = count($matches[1]);
for ($i=0 ; $i<$num ; $i++) {
    echo $matches[1][$i] . ':' . $matches[2][$i] . '<br />';
}

Und Sie erhalten:

quote1:have you trying it off and on again ?
quote65:You wouldn't steal a helmet of a policeman

Hinweis: Sie sollten einige Sicherheitschecks Hinzufügen (wie preg_match_all muss true zurückgeben, müssen Zahl mindestens 1, ... sein)

Als Randbemerkung: regex mit HTML zu analysieren ist in der Regel nicht eine wirklich gute Idee ; Wenn Sie einen echten Parser verwenden können, soll es seinen Weg sicherer ...

Wie üblich, Extrahieren von Text aus HTML und andere nicht-regulären Sprachen sollte mit einem Parser getan werden - Regexes können Probleme hier verursachen. Aber wenn Sie Ihre Daten Struktur sicher sind, könnten Sie verwenden

%<td>((?s).*?)</td>\s*<td>((?s).*?)</td>%

die beiden Teile des Textes zu finden. 1 \. \ 2 wäre dann der Ersatz

Wenn der Text nicht mehr als eine Zeile erstrecken, werden Sie sicherer, die (?s) Bits fallen ...

Verwenden Sie regex nicht, einen HTML-Parser verwenden. Wie der PHP Einfache HTML-DOM-Parser

Extrahieren Sie jedes Gehalt von <td>

    preg_match_all("%\<td((?s).*?)</td>%", $respose, $mathes);
    var_dump($mathes);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top