![]() |
RegEx != RegEx? PHP ereg liefert immer nur REG_BADRPT
Hallo,
ich habe ein Problem mit einem RegEx und zwar möchte ich aus einem String 3 Teilstrings haben, ist ja nicht weiter wild nur jetzt wollte ich das auf der Serverseite lösen um damit noch andere Sachen anzustellen. Der String kann "status:up@pppX", "status:waiting@pppX" oder "status:down" sein. nun hatte ich im Programm dieses RegEx verwendet: "^(.*?):(.*?)(@(.*?))?$" funktioniert aber nicht in PHP, was mache ich denn nur falsch? :( Grüße und einen schönen ersten Mai |
Re: RegEx != RegEx? PHP ereg liefert immer nur REG_BADRPT
a) ja es gibt verschiedene Variantenfür RegEx. Was mir bei deinem Beispiel auffällt sind die (). viele RegEx benutzen stattdessen []. Probier das mal!
|
Re: RegEx != RegEx? PHP ereg liefert immer nur REG_BADRPT
MÖP!
[] sind für Zeichenklassen, () sind zur Abgrenzung von Gruppen bzw. lookahead/lookbehind. du solltst preg_* benutzen, die sind POSIX-konform. ereg sind afaik aber etwas schneller. Außerdem hast du die Anfangs- und Endzeichen vergessen:
Code:
EDIT: außerdem wird der für status:down nix finden.
"^(.*?):(.*?)(@(.*?))?$" => "|^(.*?):(.*?)(@(.*?))?$|"
(man beachte die pipes)
Code:
Ich werd das mal kurz testen... Nein, das bringt keine befriedigenden Ergebnisse.. werde mal weiterversuchen.
=status:(((waiting|up)@(.*?))|down)=
|
Re: RegEx != RegEx? PHP ereg liefert immer nur REG_BADRPT
Hoi,
mit
Code:
funktioniert es, das selbe ergebnis wie mit TRegExp.
preg_match("|^(.*?):(.*?)(@(.*?))?$|", $linestatus, $regs);
Ist der einzige Unterschied in PHP die Pipes? //Edit: also bei mir gehts so
Code:
$linestatus = "status:up@ppp0";
preg_match("|^(.*?):(.*?)(@(.*?))?$|", $linestatus, $regs); echo "1:".$regs[1]."\n"; // ist status echo "2:".$regs[2]."\n"; // ist up echo "3:".$regs[3]."\n"; // ist @ppp0 echo "4:".$regs[4]."\n"; // ist ppp0
Code:
aber wenn es noch eleganter geht bin ich ganz ohr ;)
$linestatus = "status:down";
preg_match("|^(.*?):(.*?)(@(.*?))?$|", $linestatus, $regs); echo "1:".$regs[1]."\n"; // ist status echo "2:".$regs[2]."\n"; // ist down echo "3:".$regs[3]."\n"; // leer echo "4:".$regs[4]."\n"; // leer |
Re: RegEx != RegEx? PHP ereg liefert immer nur REG_BADRPT
Das sind nicht "die pipes", das sind die ausdrucksanfangs- und endzeichen. Was das für zeichen sind, ist egal. =,/,|,a,b,c... das zeichen darf dann nur inenrhalb des regex nicht mehr vorkommen.
Meine version:
Code:
Ergebnis:
<pre>
<?php $tests = array('status:up@ppX','status:waiting@ppX','status:down'); foreach ($tests as $test) { preg_match('=^(status):((.*?)@(.+)|down)$=',$test,$matches); print_r($matches); print "\n"; } ?> </pre>
Code:
Allerdings müssste mans noch schaffen, den status (waiting/up/down) in den selben index zu schieben.
Array
( [0] => status:up@ppX [1] => status [2] => up@ppX [3] => up [4] => ppX ) Array ( [0] => status:waiting@ppX [1] => status [2] => waiting@ppX [3] => waiting [4] => ppX ) Array ( [0] => status:down [1] => status [2] => down ) |
Re: RegEx != RegEx? PHP ereg liefert immer nur REG_BADRPT
evtl. down noch mal einklammern? *hrm*
Edit: Nee, das ist Blödsinn... aber dashier:
Code:
bringt das hier:
<pre>
<?php $tests = array('status:up@ppX','status:waiting@ppX','status:down'); foreach ($tests as $test) { preg_match('=^(status):((.*?)@(.+)|down)$=',$test,$matches); if (count($matches) < 4) { $matches[3] = $matches[2]; $matches[4] = "none"; } print_r($matches); print "\n"; } ?> </pre>
Code:
Array
( [0] => status:up@ppX [1] => status [2] => up@ppX [3] => up [4] => ppX ) Array ( [0] => status:waiting@ppX [1] => status [2] => waiting@ppX [3] => waiting [4] => ppX ) Array ( [0] => status:down [1] => status [2] => down [3] => down [4] => none ) |
Re: RegEx != RegEx? PHP ereg liefert immer nur REG_BADRPT
Zitat:
Hmmm in deiner Version das ist aber nicht gerade einfacher zu handhaben da der Status dann in verschiedenene Elementen sein kann. Und der Status kann (im schlimmsten fall) auch noch "error" sein, sprich "status:error" deswegen ist es statisch nach down zu suchen nicht gerade von Vorteil denke ich mir mal. |
Re: RegEx != RegEx? PHP ereg liefert immer nur REG_BADRPT
Zitat:
Ja, escapen kann mans. Hier meine endgültige version, die leider etwas overhead produziert, dafür aber reines regex ist:
Code:
Ergebnis:
<pre>
<?php $tests = array('status:up@ppX','status:waiting@ppX','status:down'); $exp = '/(?<=^status:) (((up|waiting|down)(@?)(.*?))) (?=$)/x'; foreach ($tests as $test) { preg_match($exp,$test,$matches); print_r($matches); print "\n"; } ?> </pre>
Code:
Status am Index 3, Server falls vorhanden an 5.
Array
( [0] => up@ppX [1] => up@ppX [2] => up@ppX [3] => up [4] => @ [5] => ppX ) Array ( [0] => waiting@ppX [1] => waiting@ppX [2] => waiting@ppX [3] => waiting [4] => @ [5] => ppX ) Array ( [0] => down [1] => down [2] => down [3] => down [4] => [5] => ) Ich werd mal sehen, ob man da noch was rauswerfen kann. |
Re: RegEx != RegEx? PHP ereg liefert immer nur REG_BADRPT
Zitat:
|
Re: RegEx != RegEx? PHP ereg liefert immer nur REG_BADRPT
Ich greife mir mal das Thema, denn ich habe auch eine Frage dazu. :stupid: Ich habe eine nette kleine Datei mit INI-ähnlichen Sektionen à la
[code=pre][bla] ...
Code:
Den markierten Teil möchte ich erkennen, herausnehmen, separat behandeln und später wieder einfügen. Die Grundlage habe ich bereits:
[b]jede Menge Text[/b]
[blu]
Code:
Das funktioniert allerdings nur, wenn nach der markierten Sektion noch eine andere in eckigen Klammern kommt. Das ist aber kein Muss. Hier könnte auch das Dateiende sein. Was muss ich also im rot markierten Teil ergänzen, damit er sowohl eine öffnende eckige Klammer am Zeilenanfang als auch das Dateiende erkennt?
preg_match_all("/^\[code\](.*?)[color=red](^\[)[/color]/msi", $source, $codeParts);
|
Re: RegEx != RegEx? PHP ereg liefert immer nur REG_BADRPT
Code:
Da die RegEx nicht ungreedy gesetzt ist müsst sie ja per default greedy sein, also sie viele Daten mitnehmen wie geht... also prüfst du nach dem Anfang eines neuen Block oder dem Ende der Zeile...
(^\[|$)
(ungetestet) |
Re: RegEx != RegEx? PHP ereg liefert immer nur REG_BADRPT
Hallo Matthias,
versuch mal das:
Code:
Du suchst einfach alles, was keine [ ist ;)
preg_match_all("/^\[code\]([^\[]*?)/msi", $source, $codeParts);
Du hast dann aber ein Problem, wenn eine eckige Klammer im Text vorkommt ;) Greetz alcaeus |
Re: RegEx != RegEx? PHP ereg liefert immer nur REG_BADRPT
Zu einfach, :stupid:, den hatte ich schon. Wenn ich das ergänze, dann nimmt er auch Leerzeilen innerhalb der gesuchten Sektion als Ende, und das soll er ja nicht. Sorry, mein Fehler, :oops:, hätte ich erwähnen müssen.
@alca: Kann ich auch nicht machen, ;), da eben auch eckige Klammern innerhalb des Textes vorkommen können. |
Re: RegEx != RegEx? PHP ereg liefert immer nur REG_BADRPT
Code:
Dann nimm den ;) der ist nun auch getestet ;)
preg_match_all("/^\[code\](.*)(\[?)/msi", $source, $codeParts);
/Edit: aber auch nich so richtig :/ :pale: *hrrrm* |
Re: RegEx != RegEx? PHP ereg liefert immer nur REG_BADRPT
Dann bleibt dir wohl nichts anderes uebrig, als die ersten Sektionen mit deiner Regex auszulesen, und die letzte dann anhand der Position der gefundenen Sektionen im Ursprungsstring zu bestimmen.
Das $ matcht in Multiline-Expressions naemlich immer das Zeilenende, das kannst du nicht verhindern. Von daher gibt es afair keinen gesunden Weg, das Stringende zu bestimmen ;) Greetz alcaeus |
Re: RegEx != RegEx? PHP ereg liefert immer nur REG_BADRPT
\Z oder \z müsste korrekt sein, wenn ich nicht irre. Zumindest funktioniert die Idee. Ich habe noch einen Bug drin, aber der hat mit einer anderen Sache zu tun :mrgreen:.
|
Re: RegEx != RegEx? PHP ereg liefert immer nur REG_BADRPT
Klappt. Ich habe fertig. :stupid: Ich habe gerade eine Miniklasse für einen zweiteiligen Inno Setup-Highlighter geschrieben. Der nutzt GeSHi, formatiert aber Skript- und Pascalteil separat. Darum die Auftrennung der
Zitat:
Also, herzlichen Dank an alle Mitwürgenden. :mrgreen: |
Re: RegEx != RegEx? PHP ereg liefert immer nur REG_BADRPT
/Edit: zu viel probiert und nicht mitgelesen, vergesst es :/
|
Re: RegEx != RegEx? PHP ereg liefert immer nur REG_BADRPT
Wieso? Ich habe noch eine Kleinigkeit gefunden. Wenn unmittelbar hintereinander zwei [Code]-Sektionen folgen, ignoriert er die zweite. Folgen gleich drei [Code]-Sektionen aufeinander, ignoriert er die mittlere. :gruebel:
|
Re: RegEx != RegEx? PHP ereg liefert immer nur REG_BADRPT
Damit geht es
Code:
:stupid:
"/^\[code\](.*?)(^\[[^code]|\Z)/msi"
Jetzt benötige ich nur noch eine Möglichkeit, Kommentare und Prä-Prozessor-Anweisungen zu finden, die sich direkt am Dateianfang befinden. Das gehört aber mehr zu GeSHi. Die folgenden Zeilen werden bspw. so formatiert:
Code:
Dreh ich es um, würde die ISPP-Anweisung schwarz sein, und der Kommentar gefärbt werden. Füge ich am Anfang eine Leerzeile ein, dann wird beides korrekt gefärbt. Ich schätze, dass hier irgendwo das Problem liegt:
; Kommentar
[color=red]#define ISPP "bla"[/color]
Code:
2 => array(
GESHI_SEARCH => '^;.*$', GESHI_REPLACE => '\\0', GESHI_MODIFIERS => 'm', GESHI_BEFORE => '', GESHI_AFTER => '' ) btw, COMMENT_SINGLE (stellt GeSHi für Zeilenkommentare zur Verfügung) kann ich nicht nutzen. Ich habe auch nicht mehr daran gedacht, dass das Semikolon auch als Trennzeichen in den einzelnen Sektionen benutzt wird. Man hat mich daran erinnert. ;) Folglich würde alles hinter einem Semikolon als Kommentar miss-interpretiert werden.
Code:
Darum der Umweg über reguläre Ausdrücke.
[Files]
Source: "bla.exe"[color=green]; DestDir: "{app}"[/color] |
Re: RegEx != RegEx? PHP ereg liefert immer nur REG_BADRPT
Zitat:
Code:
das [^code] kann dir glaube zum Verhängnis werden
(^\[[^code]|\Z)
heisst doch umschrieben: ( beginne match ^ Zeilenanfang \[ Zeichen: Eckige Klammer auf [^code] keines der Zeichen c, o, d oder e (einzelnes Zeichen) | oder \Z end of subject oder Zeilenumbruch am Ende ) beende match Was den Single-Line-Comment angeht... [Edit #1: hier stand mal wieder Shredder, den ich vorsichtshalber entfernt hab] Da kommt sich irgendwo irgend etwas in die Quere bei Geshi. Ohne alles liefert:
Code:
Das hier:
<pre>
<?php $source1 ='; Kommentar #define ISPP "bla"'; $source2 ='#define ISPP "bla" ; Kommentar'; $GESHI_SEARCH = '^;.*$'; $GESHI_REPLACE = '\\0'; $GESHI_MODIFIERS = 'm'; $source1 = preg_replace("#$GESHI_SEARCH#$GESHI_MODIFIERS", "<span style='color:#f00;'>$GESHI_REPLACE</span>", $source1); $source2 = preg_replace("#$GESHI_SEARCH#$GESHI_MODIFIERS", "<span style='color:#f00;'>$GESHI_REPLACE</span>", $source2); echo $source1."\n\n".$source2; ?> </pre>
Code:
[Edit #2: Ich hab noch mal dran gebastelt]
[color=#ff0000]; Kommentar[/color]
#define ISPP "bla" #define ISPP "bla" [color=#ff0000]; Kommentar[/color]
Code:
erzeugt folgendes:
<pre>
<?php $source1 ='; Kommentar #define ISPP "bla"'; $source2 ='#define ISPP "bla" ; Kommentar'; $GESHI_SEARCH[] = '@^;.*$@m'; $GESHI_SEARCH[] = '@^#.*$@m'; $GESHI_REPLACE[] = "<span style='color:#090;'>\\0</span>"; $GESHI_REPLACE[] = "<span style='color:#f00;'>\\0</span>"; $source1 = preg_replace($GESHI_SEARCH, $GESHI_REPLACE, $source1); $source2 = preg_replace($GESHI_SEARCH, $GESHI_REPLACE, $source2); echo $source1."\n\n".$source2; ?> </pre>
Code:
Wenn du also die Compiler-Statements, die am Anfang stehn IRGENDWIE overriden kannst dann leg eine ähnliche regex wie bei den singleline-omments an
[color=#009900]; Kommentar[/color]
[color=#ff0000]#define ISPP "bla" #define ISPP "bla"[/color] [color=#009900]; Kommentar[/color] Überzeugen darfst du dich hier: ![]() |
Re: RegEx != RegEx? PHP ereg liefert immer nur REG_BADRPT
Zitat:
[code=pre][Code] { ... jede Menge Pascal-artiger Code ... } [Code] // noch mehr davon [Files] ...
Code:
Deswegen dachte ich, dass ich per Zufall die Lösung gefunden hätte. :gruebel:
...
Zu den Kommentaren kann ich bisher nichts sagen, weil du deine PHP-Lösung selbst per "preg_replace" geschrieben hast. Problem: Ich benutze ![]() Na ja, wenn ich nicht vorwärts komme, dann suche ich mir einen anderen Highlighter. Irgendwo habe ich noch den Beautifer liegen. :lol: |
Re: RegEx != RegEx? PHP ereg liefert immer nur REG_BADRPT
Bin mal nich so und übersetz es in dieses Array-Format (womit sicher auch nur preg_replace gefüttert wird):
Code:
So müsst es GeSHi genau so formatieren, wie ich im Beispiel, gesetz dem Fall, dass dieses BEFORE / AFTER für Formatierungen ist ;)
2 => array(
GESHI_SEARCH => '^;.*$', GESHI_REPLACE => '\\0', GESHI_MODIFIERS => 'm', GESHI_BEFORE => '<span style="color:#090;">', GESHI_AFTER => '</span>' ) 3 => array( GESHI_SEARCH => '^#.*$', GESHI_REPLACE => '\\0', GESHI_MODIFIERS => 'm', GESHI_BEFORE => '<span style="color:#f00;">', GESHI_AFTER => '</span>' ) [Edit: noch mal zum nicht code ;) ] ersetz mal dieses:
Code:
durch dieses:
"/^\[code\](.*?)(^\[[^code]|\Z)/msi"
Code:
Du musst nur aufpassen dass du dir nur Match #1 also \\1 holst.
"/^\[code\](.*?)([\r\n]+\[(?!code)\]|\Z)/msi"
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:20 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz