php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2010

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 23.11.2010, 07:29  
Neuer Benutzer
 
Registriert seit: 20.11.2009
Beiträge: 3
PHP-Kenntnisse:
Anfänger
Juuro befindet sich auf einem aufstrebenden Ast
Standard Regex-Problem trotz ungreedy

Hallo allerseits,

ich habe ein Problem mit der Anwendung von regulären Ausdrücken mit PHP.

Mein zu durchsuchender Text sieht ungefähr so aus:
Code:
Filmtitel
...
Kinostart: 2010
...
Filmtitel
...
Kinostart: 2010
...
Filmtitel
...
Kinostart: 30.12.2010
...
Filmtitel
...
Kinostart: 2010
Ich suche den Textteil der Form:
Code:
Filmtitel
...
Kinostart: 30.12.2010
D.h. ich will den Filmtitel .... Kinostartdatum-Block nur haben wenn ein genaues Datum feststeht.

Wenn ich das mit einem per U-Operator ungreedy gemachten Regulären Ausdruck dürchführe, würde ich aber bei obigem Beispiel folgendes Ergebnis erhalten:
Code:
Filmtitel
...
Kinostart: 2010
...
Filmtitel
...
Kinostart: 2010
...
Filmtitel
...
Kinostart: 30.12.2010
D.h. sobald die preg_match_all-Funktion "Filmtitel" gefunden hat sammelt sie alles ein, bis ein korrektes Datum kommt. Ich möchte aber nur einen direkt zusammenhängenden "Filmstarts ... Kinostart"-Block haben.

Wie kann ich das hinbekommen?

Viele Grüße, Juuro
__________________
illumination der wirklichkeit
Juuro ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 23.11.2010, 08:23  
Erfahrener Benutzer
 
Registriert seit: 01.09.2010
Beiträge: 4.563
PHP-Kenntnisse:
Fortgeschritten
eagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Mensch
Standard

lass dein preg-match wie es ist, und werte den "Datumsteil" in einem 2ten Schritt aus ...(ist ja recht einfach, da es nach String ausschaut, mach einfach nen strlen() Vergleich mit "größer als" 15 (wenn ich richtig gezählt habe, dann ist das "Kinostart: jahr") - sollten auch Angaben der Form monat / Jahr vorkommen, dann vergleiche auf "größer als" 18

alternativ müsstest du deine Datumsregel so anpassen, dass sie auf ein reguläres Datum prüft ...

Kannst du vielleicht dein Textbeispiel, das gewünschte Ergebnis und das was du momentan erhältst mal bitte so anpassen, dass man die einzelnen Filmtitel auseinanderhalten kann. Ich seh momentan noch die Gefahr, dass du eventuell einen Filmtitel ganz überspringst, wenn überhaupt kein Startermin angegeben ist - oder kannst du diesen Fall ausschließen?
__________________
"Irren ist männlich", sprach der Igel und stieg von der Drahtbürste
eagle275 ist offline  
Alt 23.11.2010, 10:13  
Moderator¹
 
Registriert seit: 28.03.2010
Beiträge: 7.470
PHP-Kenntnisse:
Fortgeschritten
ChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer Anblick
Standard

Zitat:
Zitat von Juuro Beitrag anzeigen
ich habe ein Problem mit der Anwendung von regulären Ausdrücken mit PHP.
Dann zeig uns wenigstens, welchen Ausdruck du bisher hast, und beschreibe, was du dir dabei gedacht hast.
__________________
RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
ChrisB ist offline  
Alt 23.11.2010, 19:03  
Neuer Benutzer
 
Registriert seit: 20.11.2009
Beiträge: 3
PHP-Kenntnisse:
Anfänger
Juuro befindet sich auf einem aufstrebenden Ast
Standard

Vielen Dank für eure Antworten!

Zitat:
Zitat von eagle275 Beitrag anzeigen
lass dein preg-match wie es ist, und werte den "Datumsteil" in einem 2ten Schritt aus ...(ist ja recht einfach, da es nach String ausschaut, mach einfach nen strlen() Vergleich mit "größer als" 15 (wenn ich richtig gezählt habe, dann ist das "Kinostart: jahr") - sollten auch Angaben der Form monat / Jahr vorkommen, dann vergleiche auf "größer als" 18
Wie meinst du das? Ich habe ja moementan das Problem, dass ich als Ergebnis sowas erhalte:

Code:
Filmtitel 1
...
Kinostart: 2010
...
Filmtitel 2
...
Kinostart: 2010
...
Filmtitel 3
...
Kinostart: 30.12.2010
Wobei aber dann im Ergebnis Filmtitel 1 und Kinostart 30.12.2010 zusammengehören. Was natürlich total falsch ist. Darum verstehe ich nicht was mir das abzählen bringt, denn ich müsste ja dann auch noch rückwirkend rausfinden welches der richtige zugehörige Filmtitel ist.

Zitat:
Zitat von eagle275 Beitrag anzeigen
alternativ müsstest du deine Datumsregel so anpassen, dass sie auf ein reguläres Datum prüft ...
Was meinst du mit regulärem Datum? Ich prüfe ja auf ein Datum der Form dd.mm.YY

Zitat:
Zitat von eagle275 Beitrag anzeigen
Kannst du vielleicht dein Textbeispiel, das gewünschte Ergebnis und das was du momentan erhältst mal bitte so anpassen, dass man die einzelnen Filmtitel auseinanderhalten kann. Ich seh momentan noch die Gefahr, dass du eventuell einen Filmtitel ganz überspringst, wenn überhaupt kein Startermin angegeben ist - oder kannst du diesen Fall ausschließen?
Was meinst du? Siehe meine momentane Regex... Kein Starttermin gibt es nicht.

Zitat:
Zitat von ChrisB Beitrag anzeigen
Dann zeig uns wenigstens, welchen Ausdruck du bisher hast, und beschreibe, was du dir dabei gedacht hast.
Mein Ausdruck sieht bisher so aus:
PHP-Code:
'/\<a href\=\'\/kritiken\/.*\.html\'\>(.*)\<\/a\>\<\/h2\>.*Kinostart\:\s*([0-9]{2})\.([0-9]{2})\.([0-9]{4})/U' 
Das Problem ist, dass in dem zu durchsuchenden String zwischen dem "</h2>" und dem "Kinostart" ganz viel Kram steht der mir total egal ist. Aber da kann halt jegliches Zeichen vorkommen. Darum hält es die Regex halt auch nicht auf wenn da nochmal "<a href..." vorkommt. Ich habe mir gestern noch gedacht, dass ich ja dann irgendwie innerhalb dem .* das Wort "kritiken" ausschließen kann. Aber das habe ich leider nicht hinbekommen.
__________________
illumination der wirklichkeit

Geändert von Juuro (23.11.2010 um 19:09 Uhr).
Juuro ist offline  
Alt 24.11.2010, 08:14  
Erfahrener Benutzer
 
Registriert seit: 01.09.2010
Beiträge: 4.563
PHP-Kenntnisse:
Fortgeschritten
eagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Mensch
Standard

also mal so ins Blaue .. du musst mit Hilfe von preg_match die einzelnen Terme zusammenfassen - da war doch irgendwas mit Klammern - dann kannst du einfach diejenigen Terme auswählen, die du haben willst.

preg_match unterstützt einen dritten Parameter, dort übergibst du ein leeres Array und preg_match liefert dir die gewünschten Terme direkt als array-Einträge. Guckst du hier : http://de.php.net/manual/de/function.preg-match.php

sieh dir besonders die Usercomments an, dort wird auch das Zusammenfassen von Gruppen mehrfach erklärt

Mein "Stringlänge des Datums mit 15 bzw 18 vergleichen bezog sich natürlich darauf, da ich irgendwie erwartet hatte, dass du den ursprünglichen langen Text gleich durch Termzusammenfassung in ein array gesplittet hast, wo du dann nur den jeweiligen Datumsteil dieser Prüfung unterziehen müsstest.

Aber mal so nebenbei ..
Zitat:
ich prüfe ja auf ein Datum der Form dd.mm.YY
das scheint aber noch daneben zu gehen - denn wenn dieser Test richtig funktioniert, dann bekommst du darüber auch nur diejenigen Textabschnitte, die auch wirklich ein echtes Datum enthalten mithin dürften in deiner Lösung keine einzelnen Zeilen "Kinostart: 2010" mehr vorkommen. Da müsstest du wohl nochmal ein wenig am regulären Ausdruck basteln
__________________
"Irren ist männlich", sprach der Igel und stieg von der Drahtbürste

Geändert von eagle275 (24.11.2010 um 08:19 Uhr).
eagle275 ist offline  
Alt 24.11.2010, 08:32  
Erfahrener Benutzer
 
Registriert seit: 23.09.2010
Beiträge: 146
PHP-Kenntnisse:
Fortgeschritten
jabubo ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Ich schließe mich aegle275 an, du solltest etwas mehr Klammern verwenden und den 3. Parameter nutzen. Klammere zum Beispiel .* vor dem "Kinostart". Es ist dann zwar noch in der Ergebnismenge enthalten, allerdings in einem separatem Array-Feld.
__________________
PHP online testen, zum Beispiel: md5, base64_decode, preg_match, urldecode und viele weitere...
jabubo ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
RegEx Problem puwu PHP Tipps 2010 1 24.10.2010 00:00
[Erledigt] Problem mit Mehrsprachigkeit Sniper_Kotaro PHP Tipps 2009 2 16.12.2009 11:47
[Erledigt] RegEx Suchmuster Problem henny23 PHP Tipps 2009 3 26.10.2009 16:39
regex, [^abc] problem FirePanther PHP Tipps 2009 15 30.08.2009 13:32
Regex Problem knea PHP Tipps 2009 5 08.05.2009 13:03
Problem mit zu langen String -> regex PHP Tipps 2006 1 25.01.2006 17:38
[Erledigt] Problem mit einem Regex PHP-Fortgeschrittene 4 23.01.2006 09:34
[Erledigt] Regex Problem. PHP Tipps 2007 14 07.11.2005 15:24
komplexeres Regex Problem Schaelle PHP Tipps 2005-2 14 29.08.2005 20:21
Problem mit RegEx freq.9 PHP Tipps 2005-2 3 29.08.2005 13:32
Regex Problem PHP Tipps 2005-2 8 14.08.2005 18:40
Regex für attribute in quelltexten robo47 PHP Tipps 2005 6 27.01.2005 18:29
dropdown/checkboxe - problem ohne lösung trotz suche anakadai PHP Tipps 2004 2 04.11.2004 01:17
Problem mit regex PHP Tipps 2004 1 09.09.2004 10:00
[Erledigt] regex problem PHP Tipps 2004 9 04.09.2004 16:46

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
regex ungreedy, regex zusammenhängend, beispiel für ungreedy, regex zusammenhängende zeichenfolge ausschliessen, regex ungreedy online test, php regex (.*?) ungreedy, php regex ungreedy, preg ungreedy vs or, deutsch ungreedy

Alle Zeitangaben in WEZ +2. Es ist jetzt 21:19 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum