AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein RegEx != RegEx? PHP ereg liefert immer nur REG_BADRPT
Thema durchsuchen
Ansicht
Themen-Optionen

RegEx != RegEx? PHP ereg liefert immer nur REG_BADRPT

Ein Thema von static_cast · begonnen am 1. Mai 2006 · letzter Beitrag vom 5. Mai 2006
Antwort Antwort
Seite 1 von 3  1 23      
static_cast

Registriert seit: 19. Okt 2003
Ort: Peine
300 Beiträge
 
#1

RegEx != RegEx? PHP ereg liefert immer nur REG_BADRPT

  Alt 1. Mai 2006, 16:52
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
Daniel M.
"The WM_NULL message performs no operation. An application sends the WM_NULL message if it wants to post a message that the recipient window will ignore."
  Mit Zitat antworten Zitat
Ratte

Registriert seit: 12. Dez 2003
Ort: Erfurt
345 Beiträge
 
Delphi 2005 Personal
 
#2

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

  Alt 1. Mai 2006, 16:54
a) ja es gibt verschiedene Variantenfür RegEx. Was mir bei deinem Beispiel auffällt sind die (). viele RegEx benutzen stattdessen []. Probier das mal!
Schiffsratte der U.S.S. Delphipraxis, Laderaum 4538
BUSH:= TTerminator.create;
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#3

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

  Alt 1. Mai 2006, 16:57
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.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
static_cast

Registriert seit: 19. Okt 2003
Ort: Peine
300 Beiträge
 
#4

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

  Alt 1. Mai 2006, 17:08
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
Daniel M.
"The WM_NULL message performs no operation. An application sends the WM_NULL message if it wants to post a message that the recipient window will ignore."
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#5

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

  Alt 1. Mai 2006, 17:31
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.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Benutzerbild von cruiser
cruiser

Registriert seit: 23. Dez 2003
Ort: Königsbrück/Sachsen
455 Beiträge
 
Delphi 7 Enterprise
 
#6

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

  Alt 1. Mai 2006, 17:38
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
)
  Mit Zitat antworten Zitat
static_cast

Registriert seit: 19. Okt 2003
Ort: Peine
300 Beiträge
 
#7

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

  Alt 1. Mai 2006, 18:00
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.
Daniel M.
"The WM_NULL message performs no operation. An application sends the WM_NULL message if it wants to post a message that the recipient window will ignore."
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#8

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

  Alt 1. Mai 2006, 18:40
Zitat von DGL-luke:
Allerdings müssste mans noch schaffen, den status (waiting/up/down) in den selben index zu schieben.


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.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
static_cast

Registriert seit: 19. Okt 2003
Ort: Peine
300 Beiträge
 
#9

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

  Alt 2. Mai 2006, 01:43
Zitat von DGL-luke:
Zitat von DGL-luke:
Allerdings müssste mans noch schaffen, den status (waiting/up/down) in den selben index zu schieben.
Oh hab ich überlesen Naja ich werd mal etwas rumtesten...
Daniel M.
"The WM_NULL message performs no operation. An application sends the WM_NULL message if it wants to post a message that the recipient window will ignore."
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#10

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

  Alt 2. Mai 2006, 12:06
Ich greife mir mal das Thema, denn ich habe auch eine Frage dazu. 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?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:25 Uhr.
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