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-Key: 208899

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

Printed on: April 24, 2024 at 16:04 o'clock

Member: dog
dog Jul 01, 2013 updated at 12:18:13 (UTC)
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
Member: Maik87
Maik87 Jul 01, 2013 at 12:19:53 (UTC)
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.
Member: SlainteMhath
SlainteMhath Jul 01, 2013 at 12:49:55 (UTC)
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
Member: colinardo
colinardo Jul 01, 2013 updated at 13:17:31 (UTC)
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
Member: Maik87
Maik87 Jul 01, 2013 at 13:21:17 (UTC)
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
Member: Maik87
Maik87 Jul 01, 2013 updated at 13:48:53 (UTC)
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
Member: colinardo
colinardo Jul 01, 2013 updated at 14:28:16 (UTC)
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>";	  
Member: dog
dog Jul 01, 2013 updated at 14:01:51 (UTC)
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
Member: Maik87
Maik87 Jul 01, 2013 at 14:14:50 (UTC)
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
Member: Maik87
Maik87 Jul 01, 2013 at 14:28:45 (UTC)
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].
Member: colinardo
colinardo Jul 01, 2013 updated at 14:34:25 (UTC)
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...How can I mark a post as solved?
merci
Member: dog
dog Jul 01, 2013 at 14:36:24 (UTC)
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.
Member: Maik87
Maik87 Jul 01, 2013 at 14:36:29 (UTC)
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
Member: Maik87
Maik87 Jul 01, 2013 at 14:38:20 (UTC)
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.
Member: Maik87
Maik87 Jul 02, 2013 at 08:21:23 (UTC)
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?
Member: colinardo
colinardo Jul 02, 2013 updated at 08:27:20 (UTC)
Goto Top
Mit der Option s sollte der Punkt auch einen Zeilenumbruch(carriage return) mit einschließen
/Artikelbezeichnung: *(.*)http/isU

Grüße Uwe