Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   RegEx != RegEx? PHP ereg liefert immer nur REG_BADRPT (https://www.delphipraxis.net/68548-regex-%3D-regex-php-ereg-liefert-immer-nur-reg_badrpt.html)

static_cast 1. Mai 2006 15:52


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

Ratte 1. Mai 2006 15:54

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!

DGL-luke 1. Mai 2006 15:57

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:
"^(.*?):(.*?)(@(.*?))?$" => "|^(.*?):(.*?)(@(.*?))?$|"
(man beachte die pipes)
EDIT: außerdem wird der für status:down nix finden.

Code:
=status:(((waiting|up)@(.*?))|down)=
Ich werd das mal kurz testen... Nein, das bringt keine befriedigenden Ergebnisse.. werde mal weiterversuchen.

static_cast 1. Mai 2006 16:08

Re: RegEx != RegEx? PHP ereg liefert immer nur REG_BADRPT
 
Hoi,

mit
Code:
preg_match("|^(.*?):(.*?)(@(.*?))?$|", $linestatus, $regs);
funktioniert es, das selbe ergebnis wie mit TRegExp.

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:
$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
aber wenn es noch eleganter geht bin ich ganz ohr ;)

DGL-luke 1. Mai 2006 16:31

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:
<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>
Ergebnis:

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
)
Allerdings müssste mans noch schaffen, den status (waiting/up/down) in den selben index zu schieben.

cruiser 1. Mai 2006 16:38

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:
<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>
bringt das hier:

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
)

static_cast 1. Mai 2006 17:00

Re: RegEx != RegEx? PHP ereg liefert immer nur REG_BADRPT
 
Zitat:

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.
Ahhh das muss man natürlich wissen. Aber sollte dieses Zeichen noch ein mal im RegEx gefunden werden kann ich es doch Escapen mit \ oder?

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.

DGL-luke 1. Mai 2006 17:40

Re: RegEx != RegEx? PHP ereg liefert immer nur REG_BADRPT
 
Zitat:

Zitat von DGL-luke
Allerdings müssste mans noch schaffen, den status (waiting/up/down) in den selben index zu schieben.

:zwinker:

Ja, escapen kann mans. Hier meine endgültige version, die leider etwas overhead produziert, dafür aber reines regex ist:

Code:
<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>
Ergebnis:

Code:
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] =>
)
Status am Index 3, Server falls vorhanden an 5.

Ich werd mal sehen, ob man da noch was rauswerfen kann.

static_cast 2. Mai 2006 00:43

Re: RegEx != RegEx? PHP ereg liefert immer nur REG_BADRPT
 
Zitat:

Zitat von DGL-luke
Zitat:

Zitat von DGL-luke
Allerdings müssste mans noch schaffen, den status (waiting/up/down) in den selben index zu schieben.

:zwinker:

Oh hab ich überlesen ;) Naja ich werd mal etwas rumtesten...

MathiasSimmack 2. Mai 2006 11:06

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:
[b]jede Menge Text[/b]

[blu]
Den markierten Teil möchte ich erkennen, herausnehmen, separat behandeln und später wieder einfügen. Die Grundlage habe ich bereits:
Code:
preg_match_all("/^\[code\](.*?)[color=red](^\[)[/color]/msi", $source, $codeParts);
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?


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:06 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz