![]() |
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);
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:13 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