php.de

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

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 28.08.2009, 18:45  
Benutzer
 
Registriert seit: 28.08.2009
Beiträge: 52
PHP-Kenntnisse:
Fortgeschritten
FirePanther befindet sich auf einem aufstrebenden Ast
FirePanther eine Nachricht über ICQ schicken FirePanther eine Nachricht über MSN schicken FirePanther eine Nachricht über Skype™ schicken
Standard regex, [^abc] problem

hey ho
ich möchte gerne einen string kombinieren und verbieten
ich habe z.B. eine tabelle, wo eine spalte so aussieht:
<td>test</td>

wenn ich mehrere spalten habe, ist das so hier:
<td>test1</td><td>test2</td><td>test3</td>

ich möchte jetzt mit regexp z.B. den test1 rausfiltern...
ich könnte es so machen:
"<td>(.*)</td>" und rauslesen, aber bei mehreren spalten ist das ergebnis dann:
test1</td><td>test2</td><td>test3 (vom 1. bis zum letzten </td>)

deshalb möchte ich sowas ähnliches wie:
"<td>([^(</td>)]*)</td>"
wobei dann das </td> in den klammern irgendwie gruppiert behandelt werden soll
so dass der wirklich nur bis zum 1. </td> liest...
ja ich weiß, ich meinem beispiel könnte man auch [^\<] benutzen, aber wenn z.B. mei beispiel so lautet:
<td>dies ist ein < /td > test</td><td>test2</td><td>test3</td>
so dass er nur:
dies ist ein < /td > test
rausliest

bei htaccess habe ich das früher mal gebraucht, dass der alle dateien mit der endung ".html" und wo im namen NICHT "board" vorkommt auf eine bestimmte datei weiterleitet
habe es dann nur mit b geschafft (wo im namen kein "b" vorkommt), weil wenn der string mehr als einen buchstaben hat, checkt der das einzelnd durch (wo kein b, kein o, kein a, kein r und kein d drin ist)

kann das einer verstehen und mir helfen?
vielen dank
mfg
FirePanther ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 28.08.2009, 19:16  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.269
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,
benutz U (= Ungreedy, nicht gierig) als RegExp Modifier.
__________________
"Nuschel ich?" - "Was?"
Chriz ist gerade online  
Alt 28.08.2009, 19:20  
Erfahrener Benutzer
 
Benutzerbild von Mati_
 
Registriert seit: 27.06.2009
Beiträge: 107
PHP-Kenntnisse:
Fortgeschritten
Mati_ befindet sich auf einem aufstrebenden Ast
Mati_ eine Nachricht über ICQ schicken Mati_ eine Nachricht über MSN schicken
Standard

Oder nicht gierige Quantoren (*?, +?, ??).
Mati_ ist offline  
Alt 28.08.2009, 19:23  
Benutzer
 
Registriert seit: 28.08.2009
Beiträge: 52
PHP-Kenntnisse:
Fortgeschritten
FirePanther befindet sich auf einem aufstrebenden Ast
FirePanther eine Nachricht über ICQ schicken FirePanther eine Nachricht über MSN schicken FirePanther eine Nachricht über Skype™ schicken
Standard

hallo chriz,
was ist daran falsch?
PHP-Code:
    $t preg_replace('/\{loggedin\}([^loggedin]+)\{\/loggedin\}/u', ($loggedin "\\1" ""), $t);
    
$t preg_replace('/\{!loggedin\}([^loggedin]+)\{\/!loggedin\}/u', ($loggedin "" "\\1"), $t); 
edit:
PHP-Code:
    $t preg_replace('/\{loggedin\}([^loggedin]+?)\{\/loggedin\}/i', ($loggedin "\\1" ""), $t);
    
$t preg_replace('/\{!loggedin\}([^loggedin]+?)\{\/!loggedin\}/i', ($loggedin "" "\\1"), $t); 
so?
__________________
Aktuelles Projekt: [HTML5/CSS3] develope.me (in Bearbeitung)
Aktuelle Internetseiten: the-coderz.de, autoit.at, whatzyasite.de, ranking-toolz.de
FirePanther ist offline  
Alt 28.08.2009, 19:25  
Erfahrener Benutzer
 
Benutzerbild von Mati_
 
Registriert seit: 27.06.2009
Beiträge: 107
PHP-Kenntnisse:
Fortgeschritten
Mati_ befindet sich auf einem aufstrebenden Ast
Mati_ eine Nachricht über ICQ schicken Mati_ eine Nachricht über MSN schicken
Standard

Der Modifier. U, nicht u. Vielleicht auch der reguläre Ausdruck, aber dass kann man so nicht beurteilen, sondern nur erahnen, wenn man Konstrukte wie [^loggedin] sieht.
Mati_ ist offline  
Alt 28.08.2009, 19:45  
Benutzer
 
Registriert seit: 28.08.2009
Beiträge: 52
PHP-Kenntnisse:
Fortgeschritten
FirePanther befindet sich auf einem aufstrebenden Ast
FirePanther eine Nachricht über ICQ schicken FirePanther eine Nachricht über MSN schicken FirePanther eine Nachricht über Skype™ schicken
Standard

sry geht alles garnicht (wie ich es gemacht habe)
könnte einer von euch vielleicht ein beispiel machen oder eine tutorialseite posten? hab nach php manual ungreedy gegooglet und nix besonderes gefunden (nix klappt also)
ich dachte das wäre viel einfacher... o.O
sowas wie geschweifte klammern und der string wird dann als gruppe behandelt...
<td>([^{\<\/td\>}]+)</td> o.ä.
__________________
Aktuelles Projekt: [HTML5/CSS3] develope.me (in Bearbeitung)
Aktuelle Internetseiten: the-coderz.de, autoit.at, whatzyasite.de, ranking-toolz.de
FirePanther ist offline  
Alt 28.08.2009, 19:59  
Erfahrener Benutzer
 
Benutzerbild von Mati_
 
Registriert seit: 27.06.2009
Beiträge: 107
PHP-Kenntnisse:
Fortgeschritten
Mati_ befindet sich auf einem aufstrebenden Ast
Mati_ eine Nachricht über ICQ schicken Mati_ eine Nachricht über MSN schicken
Standard

Regenechsen :: Ideas come true | Reguläre Ausdrücke allg.
Mati_ ist offline  
Alt 28.08.2009, 20:05  
Benutzer
 
Registriert seit: 28.08.2009
Beiträge: 52
PHP-Kenntnisse:
Fortgeschritten
FirePanther befindet sich auf einem aufstrebenden Ast
FirePanther eine Nachricht über ICQ schicken FirePanther eine Nachricht über MSN schicken FirePanther eine Nachricht über Skype™ schicken
Standard

die ungreedhilfe dort bringt mir nicht viel:
Zitat:
U für Ungreedy
Hiermit wird die Gierigkeit von Quantifizierern umgekehrt: wenn er gesetzt ist, sind alle Quantifizierer im Regex standardmäßig nicht gierig. Sie werden nur durch ein nachfolgendes "?" gierig. Auch hierfür gibt es bei Perl kein Äquivalent.
ich werd später ma weiter nach ungreed-dingends googlen...
danke für die stichpunkte (wusste nicht wie das heißt und konnte deshalb nicht suchen)
__________________
Aktuelles Projekt: [HTML5/CSS3] develope.me (in Bearbeitung)
Aktuelle Internetseiten: the-coderz.de, autoit.at, whatzyasite.de, ranking-toolz.de
FirePanther ist offline  
Alt 28.08.2009, 20:28  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.269
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

[loggedin]+ trifft l, lllll, oo, ged, und zufälligerweise auch loggedin (sprich jede Kombination der dort angegebenen Zeichen). Der Modifier lautet wie erwähnt U (großes u). Arbeit dich doch erstmal in RegExp ein bevor du in die vollen gehst. Hilfreich immer auch, den RegExp erst einfach aufzubauen und danach um komplexere Befehle zu erweitern. Gleich einen komplexen RegExp angeben geht meistens und oft genug auch bei Profis in die Hose.
__________________
"Nuschel ich?" - "Was?"
Chriz ist gerade online  
Alt 28.08.2009, 20:46  
Erfahrener Benutzer
 
Benutzerbild von Mati_
 
Registriert seit: 27.06.2009
Beiträge: 107
PHP-Kenntnisse:
Fortgeschritten
Mati_ befindet sich auf einem aufstrebenden Ast
Mati_ eine Nachricht über ICQ schicken Mati_ eine Nachricht über MSN schicken
Standard

Es steht weit mehr über Gierigkeit in diesem Tutorial, undzwar auf Seite 4 - "Quantifizierer, Subpattern, Gruppierung" - Überschrift: "Und noch mal Quantifizierer".

Mein kurzer Erklärungsversuch:
Standardmäßig wird von einer Sequenz auf die sich ein Quantifier bezieht (also zB. .+, (foo)*, [abc]?), soviel gematcht wie möglich, mit der Einschränkung, dass der reguläre Ausdruck - wenn überhaupt möglich - erfolgreich sein muss. Wenn wir also den Ausdruck .*\d{3} auf abcxyz53423 anwenden, matcht das .* erstmal den kompletten String, legt jedoch nach jedem Character einen "saved state" an, zu dem er zurückgehen kann, sofern es der Matching-Erfolg benötigt. Um nun erfolgreich zu matchen müssen noch genau drei Ziffern gematcht werden, und um dass zu erreichen muss das ".*" Zeichen "zurückgeben". Es kehrt also zum vorherigen saved state zurück (=vor der letzten "3"), und da er danach immer noch nicht erfolgreich ist, einen weiteren, solange, bis eben das \d{3} zutreffen kann.

Um diese Matching-Art nun zu ändern, hängt man den Quantifiern ein ? an. Daraufhin wird die Sequenz nur so oft wiederholt, wie es nötig ist, dass der reguläre Ausdruck erfolgreich wird. Wieder selber Beispielstring, diesmal mit dem Ausdruck .*?\d{3}. Schon zu beginn probiert die .*? Sequenz überhaupt nicht zu matchen (da optional), doch da dass \d{3} noch nicht zutrifft, muss es "gezwungenermaßen", bis zu dem "z"-Zeichen matchen, damit der reguläre Ausdruck als ganzes erfolgreich wird.

Bei'm rausmatchen von Links aus href-Attributen kann man's gut erleben. href="(.+)" matcht zuerst den kompletten Quelltext ab dem ersten vorkommendem href, und geht dann einfach zurück bis zum letzen vorkommenden Apostroph.


Gierige Sequenzen matchen soviel wie möglich, unter der Berücksichtigung, dass der reguläre Ausdruck als ganzes erfolgreich sein muss.
Nicht gierige Sequenzen matchen sowenig wie möglich, unter der Berücksichtigung, dass der reguläre Ausdruck als ganzes erfolgreich sein muss.

Geändert von Mati_ (28.08.2009 um 20:50 Uhr).
Mati_ 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 knea PHP Tipps 2009 5 08.05.2009 13:03
Array sortieren mit regex Lupi PHP Tipps 2008 3 21.07.2008 15:17
2 Regex in PHP kompatible Syntax übersetzen NoiZy PHP-Fortgeschrittene 6 07.04.2008 09:04
Problem mit regex BLiNK PHP Tipps 2006 19 25.03.2006 13:32
problem!!! PHP Tipps 2006 6 08.02.2006 11:06
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
Problem mit regex PHP Tipps 2004 1 09.09.2004 10:00
[Erledigt] regex problem PHP Tipps 2004 9 04.09.2004 16:46
[Erledigt] Problem mit eine REGEX! PHP-Fortgeschrittene 7 04.06.2004 17:04

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
regex großes u, regex htaccess \modifier u\, regex nicht gierig, php umgekehrt regex, regexp \'^[abc], preg_replace befehl mit apostroph, html5 regex

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