php.de

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

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 02.09.2010, 21:15  
Erfahrener Benutzer
 
Registriert seit: 23.12.2003
Beiträge: 124
HSFighter zeigte ein beschämendes Verhalten in der Vergangenheit
Standard Regulärer Ausdruck sucht nicht richtig

Hallo zusammen,

ich nutze einen regulären Ausdruck um einen String zu zerlegen.
Zum Teil klappt das auch ganz gut, aber eben nur zum Teil.

Hier der versuch der Funktioniert:
PHP-Code:
$string ='[FEEDBACK] Listing 3 Entrys:
           01 "Hallo" (1.3-t) by HSFighter
           06 <Failed> "Bin wieder da" (1.A.0) by mike, text by simom
           08 "was willst du" (1.2.2.0-acb) by Google.
'
;

$pluginpattern "/(?:\")(.*?)(?:\")(?: \()(.*?)(?:\))(?: by )(.*?)(?:\\n)/i";

preg_match_all($pluginpattern$string$tarray); 
Raus bekomme ich das hier:
Code:
Array
(
    [0] => Array
        (
            [0] => "Hallo" (1.3) by HSFighter
            [1] => "Bin wieder da" (1.7.0) by mike, text by simom
            [2] => "was willst du" (1.2.0-acb) by Google.
        )
    [1] => Array
        (
            [0] => Hallo
            [1] => Bin wieder da
            [2] => was willst du
        )
    [2] => Array
        (
            [0] => 1.3
            [1] => 1.7.0
            [2] => 1.2.0-acb
        )
    [3] => Array
        (
            [0] => HSFighter
            [1] => mike, text by simom
            [2] => Google.
        )
)
Ab und zu steht aber auch mal ein <failed> im String. (siehe oben)
Das möchte ich auch gerne mit extrahieren wenn es vorhanden ist.

PHP-Code:
$pluginpattern "/(?:\<)(.*?)(?:\>)(?:\")(.*?)(?:\")(?: \()(.*?)(?:\))(?: by )(.*?)(?:\\n)/i"
Funktioniert leider nicht.

Mal ganz abgesehen von der Zahl am Anfang der Zeile die auch noch mit in das Array muss!

kann mir da jemand weiter helfen?

MfG
__________________
Wieso, weshalb, warum?
Wer nicht fragt bleibt dumm!

Geändert von HSFighter (02.09.2010 um 21:19 Uhr).
HSFighter ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 02.09.2010, 21:42  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.267
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Hallo,

du musst das ganze etwas zerlegen, dann klappt es eigentlich meist. Ich weiß jetzt nicht so ganz was du wie parsen möchtest und warum <failed> ein Problem darstellt, aber siehs doch mal so:

Zweistellige Zahl
"<failed>" (optional)
String in Anführungszeichen
Version (?)
"by"
Autor

Nun für jeden Token erstellst du einen RegExp und das ganze fügst du dann zu einem neuen RegExp zusammen:

\d{2}
(\<failed\>)?
\".*\"
\d+(\.\d)*(-\w+)?
by
.+

Also (ungetestet)
\d{2} (\<failed\> )?\".*\" \d+(\.\d)*(-\w+)? by .+

Der Vorteil ist, du kannst relativ einfach debuggen und feststellen, welcher RegExp-Token fehlschlägt.
__________________
"Nuschel ich?" - "Was?"
Chriz ist offline  
Alt 03.09.2010, 00:14  
Erfahrener Benutzer
 
Registriert seit: 23.12.2003
Beiträge: 124
HSFighter zeigte ein beschämendes Verhalten in der Vergangenheit
Standard

Hi Critz,
danke für deine schnelle Antwort.

RegExp-Token alleine:

\d{2} = Funktioniert
\".*\" = Funktioniert auch
Die Anderen leider nicht.

---
Bin aber schon weiter gekommen.

Digit am Anfang
Text zwischen < und >
Text zwischen " und "
Text zwischen ( und )
By überspringen
Rest der Zeile bis Zeilenende (linebreak)

Zitat:
$pluginpattern = "/(\\d+)(?: \<)(.*?)(?:\>)(?: \")(.*?)(?:\")(?: \()(.*?)(?:\))(?: by )(.*?)(?:\\n)/i";
Ich gebe als Bedingung vor das diese Zeichenketten vorhanden sein sollen,
da sonnst keine Auswertung der Zeile vergenommen werden darf.
das Funktioniert auch Toll.

Nur wertet er jetzt alle Zeilen aus de ein <failed> enthalten und die anderen nicht mehr.
Das mit den <failed> muss aber optional sein.
(\<failed\>)? funktioniert leider nicht.
__________________
Wieso, weshalb, warum?
Wer nicht fragt bleibt dumm!

Geändert von HSFighter (03.09.2010 um 00:29 Uhr).
HSFighter ist offline  
Alt 03.09.2010, 01:44  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.267
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Hallo,
also deine :? Konstrukte verstehe ich nicht, was sind das Lookbehind-Assertions? Ich wuerde noch U (ungreedy) als Modifier hinzufuegen und den Test auf failed wie von mir beschrieben einbauen. Vielleicht auch einfach in deinen alten Query, denn der funktioniert ja scheinbar bis auf <failed>. Mit (irgendwas)? machst du eine Gruppierung optional, was du ja suchst.
__________________
"Nuschel ich?" - "Was?"
Chriz ist offline  
Alt 03.09.2010, 07:41  
Moderator
 
Benutzerbild von Asipak
 
Registriert seit: 18.07.2005
Beiträge: 4.072
Asipak sorgt für eine eindrucksvolle AtmosphäreAsipak sorgt für eine eindrucksvolle Atmosphäre
Standard

?: bewirkt, dass der gruppierte Ausdruck nicht einzeln im Ergebnis zur Verfügung steht, aber auch nicht mehr über einen Rückbezug angesprochen werden kann. Mir stellt sich allerdings auch die Frage, wozu du bestimmte Abschnitte in deinem Ausdruck überhaupt gruppierst.

Das doppelte Escapen ist hier
Code:
(\\d+)
irgendwie unnötig.

Wie Chriz schon sagt, musst du diesen Teil
Code:
(?: \<)(.*?)(?:\>)
als optional erklären und nicht
Code:
(\<failed\>)
.

Gruß
Asipak 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
Regulärer Ausdruck - Kleinbuchstaben und Großbuchstaben Rubio PHP Tipps 2010 12 11.02.2010 19:22
[Erledigt] regulärer Ausdruck für Bibtex Datei hawkeye78 PHP-Fortgeschrittene 8 03.08.2009 15:59
[Erledigt] IP sperre funktioniert nicht richtig w35T3n PHP Tipps 2009 9 02.08.2009 10:42
[Erledigt] Regulärer Ausdruck tito PHP Tipps 2009 9 29.07.2009 15:18
[Erledigt] Billige Frage: Regulärer Ausdruck mit Zahlen zwischen 1 und 31 LeChuck PHP Tipps 2009 5 04.06.2009 12:39
[Erledigt] regulärer Ausdruck, neg. Lookbehind Felk PHP Tipps 2009 18 08.04.2009 23:48
[Erledigt] Regulärer Ausdruck - wird nich richtig erkannt? hirnchen PHP Tipps 2008 8 15.12.2008 20:26
Regulärer Ausdruck ruferp PHP Tipps 2007 1 19.06.2007 20:21
Regulärer Ausdruck funktioniert nicht PHP Tipps 2006 12 05.01.2006 20:56
Script funktioniert nicht richtig -> fehlermeldungen PHP Tipps 2005-2 2 12.09.2005 11:29
PHP funktioniert nicht richtig?! PHP Tipps 2005-2 26 11.06.2005 09:05
Sehr gieriger Regulärer Ausdruck - bitte um Hilfe PHP-Fortgeschrittene 1 01.12.2004 13:34
Regulärer Ausdruck inu PHP Tipps 2004-2 8 18.11.2004 18:07
JS: Regulärer Ausdruck HTML, Usability und Barrierefreiheit 3 25.08.2004 15:06
[Erledigt] Regulärer Ausdruck für E-Mail Adressen PHP Tipps 2004 4 05.08.2004 10:36

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php reguläre ausdrücke nicht enthalten, php sucht bestimmten ausdruck, php preg_match \rest der zeile\, php regulärer ausdruck token, // im ausdruck überspringen php

Alle Zeitangaben in WEZ +2. Es ist jetzt 17:42 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