maik87
Goto Top

Textphrasen auslesen

Hallo Gemeinde,

ich benötige mal einen kleinen Denkanstoß:

Ich möchte einen Text durchsuchen und bestimmte Stellen/Wörter in Variablen speichern.

Beispielsweise soll der Name der angesprochenen Person gefunden werden:

"Sehr geehrter Herr <-NACHNAME->,"

Ich muss dem System also erzählen, dass es das, was zwischen "Sehr geehrter Herr " und "," steht, in eine Variable packen soll.

Könnt ihr mir ein Stichwort geben, in welche Richtung ich mich durchlesen muss? Ich steh grad echt vor der Wand...


Danke!!
Gruß
Maik87

Content-ID: 208899

Url: https://administrator.de/contentid/208899

Ausgedruckt am: 21.11.2024 um 16:11 Uhr

dog
dog 01.07.2013 aktualisiert um 14:18:13 Uhr
Goto Top
Könnt ihr mir ein Stichwort geben

Reguläre Ausdrücke

und wenn du es ernst meinst:
  • Chomsky-Hierarchie (speziell Typ 0 / 1)
  • Lexer & Parser
  • flex & bison
Maik87
Maik87 01.07.2013 um 14:19:53 Uhr
Goto Top
Zitat von @dog:
Reguläre Ausdrücke
Danke!


und wenn du es ernst meinst:
  • Chomsky-Hierarchie
  • Lexer & Parser
  • flex & bison
Klingt umfangreich face-smile

Mir geht es nur darum, dass eine Webanwendung außer einer Emailschnittstelle nichts zu bieten hat und ich die Informationen aus den Email auslesen möchte. Diese sind immer gleich aufgebaut - ich muss nur an den richtigen Stellen lesen.
SlainteMhath
SlainteMhath 01.07.2013 um 14:49:55 Uhr
Goto Top
Moin,

Diese sind immer gleich aufgebaut - ich muss nur an den richtigen Stellen lesen.
Dann kommst Du evtl. mit Zeilenzählen substr() und strpos() am schnellst ans Ziel

lg,
Slainte
colinardo
colinardo 01.07.2013 aktualisiert um 15:17:31 Uhr
Goto Top
Hallo Maik87,
hier ein Beispiel mit RegEx:
$anrede = "Sehr geehrter Herr Meier,";  
preg_match_all('/Sehr geehrter? (Herr|Frau) (.*),/i',$anrede,$matches);  
$name = $matches[2];
echo $name;

Grüße Uwe
Maik87
Maik87 01.07.2013 um 15:21:17 Uhr
Goto Top
Super Uwe,

vielen Dank!!

Genau das habe ich gesucht - läuft prima.

Ich schau mal, ob ich das auf alle weitere umgebogen bekomme face-smile


Gruß
Maik87
Maik87
Maik87 01.07.2013 aktualisiert um 15:48:53 Uhr
Goto Top
Ich hänge schon face-smile

Habe dem Script die nächste Schwierigkeitsstufe gegeben - zwei Anreden:
$anrede = "Sehr geehrter Herr Meier, Sehr geehrte Frau Schulz,";  
preg_match_all('/Sehr geehrter? (Herr|Frau) (.*),/i',$anrede,$matches);  
$name = $matches[2];
echo $name .'<br>';  

Leider sieht die Ausgabe nun so aus:
Meier, Sehr geehrte Frau Schulz,

Wie bringe ich ihm noch bei, dass bei dem Komma Schluss ist und alles, was danach kommt, mich nicht mehr interessiert?

Wie bekomme ich die zweite Anrede auch ausgelesen? Das Array beinhaltet nur den ersten Treffer. Ein nochmaliges Ausführen von preg_match_all liefert exakt das gleiche Ergebnis.


Edit:
preg_match_all('/Sehr geehrter? (Herr|Frau) (.*),./i',$anrede,$matches);  
Beendet das Auslesen nach dem Komma.

Bleibt nur noch der zweite Treffer face-smile
colinardo
colinardo 01.07.2013 aktualisiert um 16:28:16 Uhr
Goto Top
$string = "Sehr geehrter Herr Meier, Sehr geehrte Frau Schulz,";  
preg_match_all('/Sehr geehrter? (Herr|Frau) (.*),/iU',$string,$matches);  
echo "Bei einer Anrede Name = " . $matches[2] . <br>;  
echo "Name 1 bei zwei Anreden = " . $matches[2] . "<br>";  
echo "Name 2 bei zwei Anreden = " . $matches[2][1] . "<br>";	  
dog
dog 01.07.2013 aktualisiert um 16:01:51 Uhr
Goto Top
/Sehr geehrter? (Herr|Frau) (?<NAME1>[^,]*),$|Sehr geehrter? (Herr|Frau) (?<NAME1a>[^,]*), ?Sehr geehrter? (Herr|Frau) (?<NAME1b>.*),$/i

O_o

Psssst, Geheimtipp: Das Stichwort heißt ungreedy
Maik87
Maik87 01.07.2013 um 16:14:50 Uhr
Goto Top
Zitat von @dog:
Psssst, Geheimtipp: Das Stichwort heißt ungreedy

DANKE!!!

preg_match_all('/Sehr geehrter? (Herr|Frau) (.*),/iU',$anrede,$matches);  

print_r($matches[2]);
Alles drin face-smile
Maik87
Maik87 01.07.2013 um 16:28:45 Uhr
Goto Top
Kann mir jetzt noch jemand sagen, woran ich festmache, wieviele Dimensionen $matches haben wird?

$anrede = "Sehr geehrter Herr Meier, sehr geehrte Frau Schulz, in Ihrem Schreiben vom 01.07.2013 teilten Sie uns mit...";  
preg_match_all('/Sehr geehrter? (Herr|Frau) (.*),/iU',$anrede,$matches);  

Hier liegt mein gesuchter Wert in $matches[2].

$anrede = "Sehr geehrter Herr Meier, sehr geehrte Frau Schulz, in Ihrem Schreiben vom 01.07.2013 teilten Sie uns mit...";  
preg_match_all('/Schreiben vom (.*) teilten/iU',$anrede,$matches);  

Hier jedoch in $matches[1].
colinardo
colinardo 01.07.2013 aktualisiert um 16:34:25 Uhr
Goto Top
oben ist der erste Match bei (Herr|Frau) und unten ist dein Match der erste, weil erstes Klammerpaar.

bitte erst mal lesen:
http://de3.php.net/manual/de/function.preg-match-all.php

denke der Thread ist beantwortet...Wie kann ich einen Beitrag als gelöst markieren?
merci
dog
dog 01.07.2013 um 16:36:24 Uhr
Goto Top
$matches[1].

Die erste Zahl ist die Capture Group:
0 = der ganze Match
1 = der inhalt vom 1. Klammerpaar ganz links
2 = usw.

Die zweite Zahl ist der Index des Treffers.

Sehr geehrter Herr Meier, sehr geehrte Frau Schulz
erzeugt 2 Treffer mit den Nummern 0 und 1.
Maik87
Maik87 01.07.2013 um 16:36:29 Uhr
Goto Top
Zitat von @colinardo:
oben ist der erste Match bei (Herr|Frau) und unten ist dein Match der erste, weil erstes Klammerpaar.
Sprich ich muss die Klammern zählen, um die Dimension zu kennen?


Hab ich - aber entweder keine Lösung gefunden oder diese nicht richtig gedeutet face-smile
Maik87
Maik87 01.07.2013 um 16:38:20 Uhr
Goto Top
Zitat von @dog:
0 = der ganze Match
1 = der inhalt vom 1. Klammerpaar ganz links
2 = usw.

Der hat gefehlt, DANKE!!


Die zweite Zahl ist der Index des Treffers.

> Sehr geehrter Herr Meier, sehr geehrte Frau Schulz
erzeugt 2 Treffer mit den Nummern 0 und 1.

Das hatte ich schon verstanden face-smile Ich suchte nur die Logik, wie die erste Dimension nummeriert ist.
Maik87
Maik87 02.07.2013 um 10:21:23 Uhr
Goto Top
Ich hänge wieder face-sad

Unzwar geht es gerade darum, eine Textphrase, welche sich über mehrere Zeilen erstreckt, auszulesen.

Ich bin inzwischen so weit:
/Artikelbezeichnung: *(.*)\n/iU

Liest bis Zeilenende.


/Artikelbezeichnung: *(.*)http/iU

Würde bis http lesen, wenn dieses in der gleichen Zeile steht. Es soll nun aber alle Zeilen lesen, bis es auf http stößt.

Wo ist der Trick?
colinardo
colinardo 02.07.2013 aktualisiert um 10:27:20 Uhr
Goto Top
Mit der Option s sollte der Punkt auch einen Zeilenumbruch(carriage return) mit einschließen
/Artikelbezeichnung: *(.*)http/isU

Grüße Uwe