2011-01-06 6 views
0

Ich habe ein HTML-Dokument, das ich als TXT-Datei gespeichert habe. Ich möchte jede Zeichenkette nach/user/extrahieren und eine durch Kommas getrennte Liste aller extrahierten Zeichenketten erstellen. Also jedes Mal, wenn es ein "/ user/boy34" in dieser txt-Datei gibt, möchte ich den "boy34" -Teil extrahieren. Ich bin wirklich neu in PHP, aber ich habe über die preg_match_all() - Funktion gelesen und ich denke, das ist es, was ich brauche.PHP - Wie suche ich ein HTML-Dokument und extrahiere bestimmte Strings in PHP?

Hier ist, was ich so weit gekommen, aber es funktioniert nicht:

<?php 
$str = file_get_contents("comment.txt"); 
preg_match_all ('/^(user\/)\/[A-Z0-9][A-Z0-9_-]+\"$/i', $str, $preg); 
print_r ($preg); 
?> 

Der Ausgang I von diesem erhalten ist:

Array ([0] => Array () [1] => Array ()) 

Kann jemand mir bitte helfen?

Antwort

2

Die Verwendung von ^ in einer Regex bedeutet, dass es nur übereinstimmt, wenn die gesamte Zeile mit Ihrem Betreff beginnt. Auch die $ am Ende bedeutet, dass die Linie auch direkt nach dem Spiel enden muss. Sie werden also nie etwas finden, es sei denn, die gesamte Linie ist nichts anderes als /user/boy34. Wahrscheinlich benötigen Sie auch das Flag m für den Mehrzeilenmodus.

Sie sollten auch die Verknüpfungen verwenden, wie \ w (Wort-Zeichen A-Za-z0-9_)

Versuchen Sie, diese RegexMuster aus: /"\/user\/(\w+)"/im

Wenn Sie ein Beispiel für Ihre HTML schreiben, ich kann das wirklich testen und dir ein funktionierendes Regex-Muster geben.

--- --- UPDATE

Getestet habe ich diese mit Hilfe von HTML:

<html> 
    <body> 
    <a href="/user/boy30" /> 
    <a href="/user/boy31" /> 
    <a href="/user/boy32" /> 
    </body> 
</html> 

und die Regex oben erwähnt, und ich habe es in diesem sehr einfachen Test zu arbeiten. Ich habe diese Seite Test: http://www.spaweditor.com/scripts/regex/index.php

Hier waren meine Ergebnisse:

Array 
(
    [0] => Array 
     (
      [0] => "/user/boy30" 
      [1] => "/user/boy31" 
      [2] => "/user/boy32" 
     ) 

    [1] => Array 
     (
      [0] => boy30 
      [1] => boy31 
      [2] => boy32 
     ) 

) 

--- Regex Erklärung ---

  • / erforderlich, um eine RegexMuster zu starten
  • " Sucht nach einem Anführungszeichen
  • \/user\/ Sucht/user/(die vorausSchrägStriche benötigt maskiert werden)
  • ( Alles, was zwischen Klammer zusammen in den Ergebnissen angezeigt werden (die Klammer verlassen wird aus nicht der Regex bricht, wird es noch die Spiele finden, aber diese ermöglicht uns, "boy32" im Vordergrund zu extrahieren.)
    • \w+ Sucht nach 1 oder mehr (+ bedeutet "1 oder mehr") Wortzeichen (äquivalent zu [a-zA-Z0-9_])
    • ) kurz die Gruppierung begonnen, bevor
  • " Sieht für eine andere doppelte Anführungszeichen
  • / am Ende jeden RegexMuster erforderlich ist, und bevor irgendwelche Flaggen
    • i Flag: Groß- und Kleinschreibung-Modus
    • m Flagge: Multi-Line-Modus (normal, Zeilenumbrüche werden Ausdrücke beenden, dies ermöglicht das Muster auch über mehrere Zeilen entsprechen)
+0

Wow es funktioniert! Vielen Dank! Kannst du mir erklären, wie du zu diesem Muster gekommen bist? – bambam

+0

Ich habe dem Regex eine Erklärung hinzugefügt, bitte wählen Sie meine Antwort als Antwort auf diese Frage aus, wenn sie Ihre Frage beantwortet hat. :) –