| PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Post your PHP questions here! |
 |

26-05-2010, 18:24
|
|
Buddy
Registrierter Benutzer
|
|
Registriert seit: Feb 2002
Beiträge: 16
|
|
Problem mit Regex Ausdruck
Hallo zusammen,
habe (wie so oft) mal wieder ein Problem mit einem Regulären Ausdruck.
Ich habe einen Text in dem folgendes rausgefiltert werden muss:
PHP-Code:
XYZ... {{BeginnExportPublicSection}}XYZ..Alle Zeichenerlaut{{EndExportPublicSection}} ...XYZ
Ich dachte es geht mit dieser Regex, nur leider wird hier nichts entfernt.
PHP-Code:
$suchstring='/\{\{BeginnExportPublicSection\}\}(.*)\{\{EndExportPublicSection\}\}/'; $result= preg_replace($suchstring,'',$result);
stell mich wohl etwas dumm an
Geändert von Buddy (26-05-2010 um 19:52 Uhr)
|

26-05-2010, 18:30
|
wahsaga
 Moderator
|
|
Registriert seit: Sep 2001
Beiträge: 24.486
|
|
Zitat:
Zitat von Buddy
stell mich wohl etwas dumm an
|
Ja, absolut.
Und zwar insb. damit, dass deine Problembeschreibung im wesentlichen nur „funzt nich“ lautet; und das sogar der Tatsache zum Trotz, dass das gezeigte Suchmuster per preg_match auf den gezeigten Text angewandt "XYZ..Alle Zeichenerlaut" als Treffer liefert.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
|

26-05-2010, 20:08
|
|
Buddy
Registrierter Benutzer
|
|
Registriert seit: Feb 2002
Beiträge: 16
|
|
Ok, bin dem Probelm näher gekommen, und zwar sind im originalstring zeilenumbrüche enthalten(waren bei dem bsp. string nicht drin, deswegen der match bei dir).
hier originalauszug aus dem zu durchsuchenden string:
PHP-Code:
...<p>{{BeginnExportPublicSection}} Ich soll öffentlich sein. {{EndExportPublicSection}} </p>...
können unendlich viele zeilenumbrüche sein, nur wie bringe ich das meinen regex bei?
|

26-05-2010, 20:10
|
wahsaga
 Moderator
|
|
Registriert seit: Sep 2001
Beiträge: 24.486
|
|
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
|

26-05-2010, 20:29
|
|
Buddy
Registrierter Benutzer
|
|
Registriert seit: Feb 2002
Beiträge: 16
|
|
"rtfm" wenn ich schon sowas less, bekomm ich schon wieder ein deutliches zeichen, das manche leute einfach nichts in nem forum antworten sollten..
ein einfaches "hey häng och ein '/s' an, das matched dir auch die zeilenumbrüche" hätte es schon getan. wenn man ein problem hat und in einem forum fragt deutet das doch meist darauf hin, das man es selber nicht hinbekommt, und wahrscheinlcih shcon am kotzen ist. da wäre doch eine einfache antwort nicht zuviel.. vorallem wenn man sie weiß.. trotzdem danke..
|

26-05-2010, 20:35
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Hallo,
mit „.*?“ statt „.*“ matcht es nicht gierig. Ansonsten würde es bei mehreren Vorkommen zuviel entfernen.
Gruß,
Amica
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt? 
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke! 
|

26-05-2010, 20:38
|
|
Buddy
Registrierter Benutzer
|
|
Registriert seit: Feb 2002
Beiträge: 16
|
|
Zitat:
Zitat von AmicaNoctis
Hallo,
mit „.*?“ statt „.*“ matcht es nicht gierig. Ansonsten würde es bei mehreren Vorkommen zuviel entfernen.
Gruß,
Amica
|
super, danke!
|

30-05-2010, 15:00
|
|
tr-oo-per
Registrierter Benutzer
|
|
Registriert seit: May 2010
Ort: at work
Beiträge: 32
|
|
Code:
$pattern = "/\{.*\{.*BeginnExportPublicSection.*\}.*\}(.*)\{.*\{.*EndExportPublicSection.*\}.*\}/i";
sollte das gewünschte leisten.
Falls nicht, versuch mal "BeginnExportPublicSection" in "BeginExportPublicSection" umzuwandeln (ein 'n' streichen). Klingt arg nach Denglisch.
|

30-05-2010, 16:02
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Zitat:
Zitat von tr-oo-per
[COLOR=#000000][COLOR=#cc0000][COLOR=Black]
Code:
$pattern = "/\{.*\{.*BeginnExportPublicSection.*\}.*\}(.*)\{.*\{.*EndExportPublicSection.*\}.*\}/i";
sollte das gewünschte leisten.
|
Nein, das leistet etwas ganz anderes, falls es überhaupt etwas sinnvolles leistet.
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt? 
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke! 
|

30-05-2010, 16:15
|
|
tr-oo-per
Registrierter Benutzer
|
|
Registriert seit: May 2010
Ort: at work
Beiträge: 32
|
|
@AmicaNoctis: etwas ganz anderes? erklär mal bitte oder biete eine Lösung an ... ich mach Deine Beiträge ja auch nicht grundlos madig!
Man könnte die von mir eingefügten '.*' durch '[\s\t\n\r]*' ersetzen, um ausschließlich Leerzeichen, Tabs oder Linebreaks neben den geschweiften Klammern zuzulassen (das Problem waren ja Zeilenumbrüche, die durch den regulären Ausdruck nicht abgedeckt waren, aber dennoch im Quelltext vorkamen).
Geändert von tr-oo-per (30-05-2010 um 16:33 Uhr)
|

30-05-2010, 16:50
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Zitat:
Zitat von tr-oo-per
erklär mal bitte oder biete eine Lösung an
|
Hatte ich schon, jedenfalls war der Fragesteller damit zufrieden. Aber meinetwegen nochmal:
PHP-Code:
'/\\{\\{BeginnExportPublicSection\\}\\}(.*?)\\{\\{EndExportPublicSection\\}\\}/s'
Dein Vorschlag dagegen war halt einfach falsch, auch wenn ich dir Recht gebe, dass ich das hätte freundlicher ausdrücken können – nichts für ungut.
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt? 
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke! 
|

30-05-2010, 17:02
|
|
tr-oo-per
Registrierter Benutzer
|
|
Registriert seit: May 2010
Ort: at work
Beiträge: 32
|
|
Mmh, okay.
Ich verstehe nur nicht, weshalb Du '\' escape'st ('\\'). Mit nur einem '\' würdest Du ja gerade die geschweiften Klammern escapen, oder?
D.h. nach meiner Auffassung ...
'/\\{/' liefert alle Stellen an denen '\{' steht, wohingegen
'/\{/' alle Stellen liefert an denen '{' steht.
Gruß,
tr-oo-per
|

30-05-2010, 17:16
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Zitat:
Zitat von tr-oo-per
Ich verstehe nur nicht, weshalb Du '\' escape'st ('\\'). Mit nur einem '\' würdest Du ja gerade die geschweiften Klammern escapen, oder?
|
Der Regex muss einen Backslash vor { haben, um deren Sonderbedeutung aufzuheben, in einem Nowdoc-String schreibe ich daher
Code:
$pattern = <<<'EOT'
<\{>
EOT;
In einem SQ/DQ-String dagegen hat auch der Backslash eine Sonderbedeutung, die durch Dopplung aufgehoben wird. PHP macht zwar netterweise auch aus "\{" ein \{, aber wenn man sich dessen nicht bewusst ist, wird man gerade als Anfänger Probleme damit haben, einen \ selbst per Regex zu matchen.
"<\\\\>" wird zum Ausdruck <\\> und der matcht ein einzelnes \. Damit das niemand vergisst, verwende ich gerade hier im Forum korrektes Escaping auch in Situationen, in denen es PHP nicht unbedingt notwendig macht.
Zitat:
Zitat von tr-oo-per
'/\\{/' liefert alle Stellen an denen '\{' steht
|
Genau das stimmt nämlich nicht.
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt? 
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke! 
Geändert von AmicaNoctis (30-05-2010 um 17:18 Uhr)
|

30-05-2010, 17:22
|
|
tr-oo-per
Registrierter Benutzer
|
|
Registriert seit: May 2010
Ort: at work
Beiträge: 32
|
|
Zitat:
Zitat von AmicaNoctis
In einem SQ/DQ-String dagegen hat auch der Backslash eine Sonderbedeutung, die durch Dopplung aufgehoben wird. PHP macht zwar netterweise auch aus "\{" ein \{, aber wenn man sich dessen nicht bewusst ist, wird man gerade als Anfänger Probleme damit haben, einen \ selbst per Regex zu matchen.
|
Verstehe. Dann macht das natürlich Sinn. PHP hat mir da bisher in ähnlichen Fällen netterweise keinen Strich durch die Rechnung gemacht, aber ich werd in Zukunft daran denken, falls es doch mal Probleme gibt.
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|