regulärer Ausdruck
Twilo
- php
0 dedlfix0 Twilo0 Twilo0 seth_not@home0 Twilo0 seth_not@home0 Twilo
0 Skeeve0 Twilo0 s.oliver0 seth_not@home
0 Flo T.
Hallo,
kurze Frage, gibt es unter PHP eine Möglichkeit und Configdatei von Perl auszulesen?
die Datei ist wie folgt aufgebaut
#####
##### xxx
#####
$xxx = "xxx";
$yyy = "yyy";
...
# xxx
$eee{fff} = 'xxx';
$ddd{ff1} = 'xxx';
$ddd{ff2} = 'xxx';
%privilege_dscr = ( 'qqq' => { de => 'xxx%xxx' },
'www' => { de => 'fff%fff' },
...
) ;
$blub = 'x'
$aaa = (getpwnam($blub))[2];
$aab = (getpwnam($blub))[3];
@month = qw (Januar Februar Maerz April Mai Juni Juli August September Oktober November Dezember);
1;
ich brauche von dieser Config ein paar Variableninhalte, z.B. von $xxx
da ich nicht weiß, ob man das irgendwie mit PHP parsen kann, habe ich ein regulären Ausdruck versucht
preg_match('/^$xxx *= *"(*)*";$/', $dateiInhalt, $treffer);
ich hab mir das so überlegt, das gesuchte muss mit $xxx anfangen, danach kommt entweder kein oder n Leerzeichen, dann kommt ein Gleichheitszeichen, danach wieder kein oder n Leerzeichen danach dann ein Anführungszeichen, danach dann die gesuchte Zeichenkette, dahinter dann noch ein Anführungszeichen + Semikolon, danach soll die gesuchte Zeichenkette zu Ende sein
als Fehlermeldung erhalte ich "Warning: preg_match(): Compilation failed: nothing to repeat at offset 23 in /home/xxx/yyy.php on line 9"
mfg
Twilo
echo $begrüßung;
preg_match('/^$xxx *= *"(*)*";$/', $dateiInhalt, $treffer);
Du hast nicht beachtet, dass das $ in einem RegExp eine besondere Bedeutung hat.
Weiterhin kann es auch sein, dass keine Leerzeichen sondern Tabulatoren oder andere Whitespace-Zeichen verwendet wurden. Ich würde die Sequenz für Whitespace-Zeichen statt des Leerzeichen verwenden.
echo "$verabschiedung $name";
Hallo,
preg_match('/^$xxx *= *"(*)*";$/', $dateiInhalt, $treffer);
Du hast nicht beachtet, dass das $ in einem RegExp eine besondere Bedeutung hat.
jo, daran hab ich nicht gedacht :-(
Weiterhin kann es auch sein, dass keine Leerzeichen sondern Tabulatoren oder andere Whitespace-Zeichen verwendet wurden. Ich würde die Sequenz für Whitespace-Zeichen statt des Leerzeichen verwenden.
ich habe das jetzt wie folgt geändert
preg_match('/^\$xxx\s*=\s*"(\w*)";$/', $dateiInhalt, $treffer);
wenn ich $treffer mit print_r ausgeben lasse, erhalte ich nur folgendes
Array
(
)
mfg
Twilo
gudn tach!
ich habe das jetzt wie folgt geändert
preg_match('/^\$xxx\s*=\s*"(\w*)";$/', $dateiInhalt, $treffer);
wenn ich $treffer mit print_r ausgeben lasse, erhalte ich nur folgendes
Array
(
)
wenn die zeilenumbrueche durch "\r\n" realisiert werden, muss vor dem "zeilenende-zeichen", also dem letzten $, noch ein "\r?" oder sowas eingefuegt werden.
prost
seth
Hallo,
ich habe das jetzt wie folgt geändert
preg_match('/^\$xxx\s*=\s*"(\w*)";$/', $dateiInhalt, $treffer);
wenn ich $treffer mit print_r ausgeben lasse, erhalte ich nur folgendes
Array
(
)
wenn die zeilenumbrueche durch "\r\n" realisiert werden, muss vor dem "zeilenende-zeichen", also dem letzten $, noch ein "\r?" oder sowas eingefuegt werden.
leider bringt das auch keinen Treffer
Ergebnis
mfg
Twilo
Hallo,
leider bringt das auch keinen Treffer
Ergebnis
m-modifier.
ok
/^$xxx\s*=\s*"|'["|'];\r?$/m
gibt bei ... = "xx"x"; xx"x zurück, die Variante von Skeeve gibt nur xx\ zurück
danke für eure Hilfe
mfg
Twilo
Moin!
preg_match('/^$xxx *= *"(*)*";$/', $dateiInhalt, $treffer);
Haufenweise Fehler in dem Ausdruck.
Am ehesten dürfte Dir der hier helfen, wenn der auch nicht narrensicher ist:
/^\s*$xxx\b\s*=\s*("(?:[^"]|\")*"|'(?:[^']|\')*')/
Wobei Du anschließend noch das erste und letze Zeichen entfernen mußt.
Aber wie gesagt: Das ist nicht narrensicher, da es in Perl viele Möglichkeiten gibt, einen Wert anzugebe:
$xxx= 'ccc';
$xxx= "ccc";
$xxx= q(ccc);
$xxx= qq<ccc>;
$xxx= <<'ENDE';
ccc
ENDE
$xxx= 'c' x 3;
# ad infinitum...
-- Skeeve
Hallo,
Am ehesten dürfte Dir der hier helfen, wenn der auch nicht narrensicher ist:
/^\s*$xxx\b\s*=\s*("(?:[^"]|\")*"|'(?:[^']|\')*')/
mfg
Twilo
gudn tach!
/^\s*$xxx\b\s*=\s*("(?:[^"]|\")*"|'(?:[^']|\')*')/
beachte den m-modifier und dessen auswirkungen auf ^ (und $).
prost
seth
Servus,
"(?:[^"]|\")*"
das funktioniert nicht so, wie Du Dir das wünschst - drehe die Reihenfolge von '\"' und '[^"]' mal um.
Grüsse
Hallo,
"(?:[^"]|\")*"
das funktioniert nicht so, wie Du Dir das wünschst - drehe die Reihenfolge von '\"' und '[^"]' mal um.
wie müßte das dann aussehen?
ich steig bei den regulären Ausdruck im Moment nicht ganz durch
mfg
Twilo
Servus,
"(?:[^"]|\")*"
das funktioniert nicht so, wie Du Dir das wünschst - drehe die
Reihenfolge von '\"' und '[^"]' mal um.wie müßte das dann aussehen?
ich steig bei den regulären Ausdruck im Moment nicht ganz durch
ich borge mir mal Skeeves Ausdruck,
/^\s*$xxx\b\s*=\s*("(?:[^"]|\")*"|'(?:[^']|\')*')/
und bemerke dazu zwei Dinge:
1. '^' und '$' machen in der Form nur Sinn, wenn Du entweder einen Einzeiler
durchsuchen willst, oder den Modifikator '/m' benutzt.
2. Die oder-Beziehung 'a|b' gibt schon 'true' bei 'a' zurück, wenn an der Position
im String 'a' vorkommt - 'b' wird gar nicht erst ausprobiert.
Das sollte es also tun:
/\s*$xxx\b\s*=\s*("(?:\"|[^"])*"|'(?:\'|[^'])*')/
, obwohl ich das (wenn überhaupt mit regulären Ausdrücken) wahrscheinlich
anders machen würde. Der Ausdruck '"(?:\"|[^"])*"' dient hier dazu, nicht
mitten im Ergebnis bei einem auskommentierten '"' hängen zu bleiben - in
dem Fall könnte kein Ergebnis gefunden werden.
Grüsse
Hallo,
Das sollte es also tun:
/\s*$xxx\b\s*=\s*("(?:\"|[^"])*"|'(?:\'|[^'])*')/
es wird etwas zurück gegeben :-)
, obwohl ich das (wenn überhaupt mit regulären Ausdrücken) wahrscheinlich
anders machen würde. Der Ausdruck '"(?:\"|[^"])*"' dient hier dazu, nicht
mitten im Ergebnis bei einem auskommentierten '"' hängen zu bleiben - in
dem Fall könnte kein Ergebnis gefunden werden.
wie würdest du das denn machen?
mfg
Twilo
gudn tach!
- Die oder-Beziehung 'a|b' gibt schon 'true' bei 'a' zurück, wenn an der Position
im String 'a' vorkommt - 'b' wird gar nicht erst ausprobiert.
jein.
du hast zwar z.b. mit
~~~perl
$_ = 'ab';
/(a|ab)/;
recht, dass $1=='a' und auch im fall
~~~perl
$_ = 'ba';
/([^a]|ba)/;
waere $1=='b', aber im fall von
~~~perl
$_ = 'abaa;';
/a([^a]|ba)*a;/;
waere $1=='ba'.
prost
seth
gudn tach!
"(?:[^"]|\")*"
das funktioniert nicht so, wie Du Dir das wünschst - drehe die Reihenfolge von '\"' und '[^"]' mal um.
ich denke, dass das (zumindest bei perl) keinen unterschied machen sollte, da afaik automatisch "gebacktrackt" wird.
#!/usr/bin/perl
use strict;
$_ = '$xxx="a\"b";';
print 'gefunden'."\n" if /^\s*\$xxx\b\s*=\s*("(?:[^"]|\\")*"|'(?:[^']|\\')*');$/;
print 'gefunden'."\n" if /^\s*\$xxx\b\s*=\s*("(?:\\"|[^"])*"|'(?:[^']|\\')*');$/;
gibt bei mir zwei mal "gefunden" aus.
prost
seth
Hallo,
"(?:[^"]|\")*"
das funktioniert nicht so, wie Du Dir das wünschst - drehe die Reihenfolge von '\"' und '[^"]' mal um.
ich denke, dass das (zumindest bei perl) keinen unterschied machen sollte, da afaik automatisch "gebacktrackt" wird.
#!/usr/bin/perl
use strict;
$_ = '$xxx="a"b";';
print 'gefunden'."\n" if /^\s*$xxx\b\s*=\s*("(?:[^"]|\")"|'(?:[^']|\')');$/;
print 'gefunden'."\n" if /^\s*$xxx\b\s*=\s*("(?:\"|[^"])"|'(?:[^']|\')');$/;
> gibt bei mir zwei mal "gefunden" aus.
und wie müßte der reguläre Ausdruck für PHP aussehen?
mfg
Twilo
--
[Farbtabelle](http://www.farb-tabelle.de)
gudn tach!
und wie müßte der reguläre Ausdruck für PHP aussehen?
fuer dein problem hat Flo wohl die beste loesung bisher genannt.
bei der loesungen von dedlfix haettest du bloss noch das "\r" beruecksichtigen muessen; und bei der loesung von Skeeve den m-modifer.
prost
seth
gudn tach Gunnar!
fuer dein problem hat Flo wohl die beste loesung bisher genannt.
bei der loesungen von dedlfix haettest du bloss noch das "\r" beruecksichtigen muessen; und bei der loesung von Skeeve den m-modifer.
der m-modifer muss selbstverstaendlich auch bei dem loesungsansatz von dedlfix beruecksichtigt werden.
prost
seth
gudn tach!
Am ehesten dürfte Dir der hier helfen, wenn der auch nicht narrensicher ist:
/^\s*$xxx\b\s*=\s*("(?:[^"]|\")*"|'(?:[^']|\')*')/
wozu die wortgrenze "\b"? die ist doch schon implizit vorhanden, oder?
Aber wie gesagt: Das ist nicht narrensicher, da es in Perl viele Möglichkeiten gibt, einen Wert anzugebe [...]
ack, es empfiehlt sich da eher, sowas, was Flo bereits verlinkt hat (http://pecl.php.net/package/perl) zu benutzen.
prost
seth
Moin!
/^\s*$xxx\b\s*=\s*("(?:[^"]|\")*"|'(?:[^']|\')*')/
wozu die wortgrenze "\b"? die ist doch schon implizit vorhanden, oder?
Korrekt. Macht der Gewohntheit. Es schadet aber auch nicht.
Durch die Diskussion über die Reihenfolge vom Gebackslashten Ausdruck und der Zeichenklasse fiel mir auf: Das geht besser:
/^\s*$xxx\s*=\s*("(?:[^\"]|\.)*"|'(?:[^\']|\.)*')/m
Damit dürfte auch PHP zufrieden sein ;-) In den Zeichenklassen wird explizit der Backslash ausgeschlossen. Ich denke nur so läßt sich auch ein Problem beheben, das mir erst jetzt aufgefallen ist:
$xxx="\"; $yyy="trallala";
würde mit meinem vorherigen Ausdruck den String "\"; $yyy=" finden. und nicht "\".
-- Skeeve
Hallo,
Durch die Diskussion über die Reihenfolge vom Gebackslashten Ausdruck und der Zeichenklasse fiel mir auf: Das geht besser:
/^\s*$xxx\s*=\s*("(?:[^\"]|\.)*"|'(?:[^\']|\.)*')/m
hat dieser Ausdruck ein Vorteil gegenüber
/^\s*$xxx\s*=\s*"|'["|']\s*;s*\r?$/m
?
bei deinen Ausdruck ist das Ergebnis z.B. 'xx'x' bei den anderen xx'x, also ohne die einfachen Hochkommas
bei deinen Ausdruck verstehe ich folgendes nicht so wirklich
("(?:[^\"]|\.)*"|'(?:[^\']|\.)*')
über eine Erläuterung würde ich mich freuen
mfg
Twilo
Moin!
hat dieser Ausdruck ein Vorteil gegenüber
/^\s*$xxx\s*=\s*"|'["|']\s*;s*\r?$/m
Ja.
bei deinen Ausdruck ist das Ergebnis z.B. 'xx'x' bei den anderen xx'x, also ohne die einfachen Hochkommas
Bei Deinem Ausdruck wird nicht beachtet, daß das führende und schließende Element gleich sein muß. Zudem erlaubst Du auch das Zeichen | anstelle von " oder '. ("|') wäre richtig ["|'] ist falsch.
bei deinen Ausdruck verstehe ich folgendes nicht so wirklich
("(?:[^\"]|\.)*"|'(?:[^\']|\.)*')
über eine Erläuterung würde ich mich freuen
( # Gruppierung mit Capture nach $1
" # "
(?: # Gruppierung ohne Capture
[^\"] # Jedes Zeichen außer \ und "
| # alternativ
\. # Ein Backslash gefolgt von einem belibigen Zeichen
) # Ende Grupierung
* # Das beliebig oft
" # "
| # alternativ
'(?:[^\']|\.)*' # dasselbe Spiel für '
) # Ende Capture nach $1
Hilft das weiter?
-- Skeeve
Hallo,
[...]
Hilft das weiter?
ja, danke
jetzt müßte man nur noch folgende Zeichen am Anfang bzw. Ende weg bekommen
" oder '
muss ich dafür substring verwenden, oder kann man den regulären Ausdruck dem enstsprechend verändern?
mfg
Twilo
Moin!
jetzt müßte man nur noch folgende Zeichen am Anfang bzw. Ende weg bekommen
" oder 'muss ich dafür substring verwenden, oder kann man den regulären Ausdruck dem enstsprechend verändern?
Du kannst dafür substring verwenden. Den Ausdruck dafür zu ändern ist nicht so einfach möglich. Eventuell geht das hier in PHP:
(?:"((?:[^\"]|(?:\.)*)"|'((?:[^\']|\.)*)')
Dann mußt Du als Treffer "$1$2" nehmen. Einer von beiden ist aber immer undefiniert und ich weiß nicht, wie PHP darauf reagiert.
In Perl würde ich die Ergebniszuweisung, um einen Warnung auszuschließen so machen:
$value= $1 || $2 || '';
-- Skeeve
Hallo,
Du kannst dafür substring verwenden. Den Ausdruck dafür zu ändern ist nicht so einfach möglich. Eventuell geht das hier in PHP:
(?:"((?:[^\"]|(?:\.)*)"|'((?:[^\']|\.)*)')
Dann mußt Du als Treffer "$1$2" nehmen. Einer von beiden ist aber immer undefiniert und ich weiß nicht, wie PHP darauf reagiert.
In Perl würde ich die Ergebniszuweisung, um einen Warnung auszuschließen so machen:
$value= $1 || $2 || '';
ich hab dein beitrag gestern nicht gesehen
ich hatte es erst einmal wie folgt gelöst substr($treffer[1], 1, -1)
dein geänderten Ausdruck werde ich noch testen
mfg
Twilo
Moin!
ich hatte es erst einmal wie folgt gelöst substr($treffer[1], 1, -1)
Ist doch gut!
dein geänderten Ausdruck werde ich noch testen
Ich persönlich würde den geänderten wohl nur in Ausnahmefällen verwenden.
-- Skeeve
Moin!
Mir fällt gerade ein: Besser ist es, auf den gefundenen Treffer einen weiteren regulären Ausdruck anzuwenden:
(Perl Syntax) s/\(.)/$1/g damit alle backslashes korrekt behandelt werden. "asd"fg" => "asd"fg"
-- Skeeve
Hi Twilo!
kurze Frage, gibt es unter PHP eine Möglichkeit und Configdatei von Perl auszulesen?
Wenn du eine Konfigurationsdatei brauchst, die du unter Perl und PHP auslesen kannst, solltest du dir mal das Modul PHP::Include im CPAN anschauen.
lg Flo
Hallo,
kurze Frage, gibt es unter PHP eine Möglichkeit und Configdatei von Perl auszulesen?
Wenn du eine Konfigurationsdatei brauchst, die du unter Perl und PHP auslesen kannst, solltest du dir mal das Modul PHP::Include im CPAN anschauen.
danke für den Link
ich brauche das jedoch genau anders herum.
Das Perl Script stammt nicht von mir. Ich möchte aber auf ein paar Variablen von diesen Script zugreifen.
mfg
Twilo
Hallo nochmal!
kurze Frage, gibt es unter PHP eine Möglichkeit und Configdatei von Perl auszulesen?
Wenn du eine Konfigurationsdatei brauchst, die du unter Perl und PHP auslesen kannst, solltest du dir mal das Modul PHP::Include im CPAN anschauen.danke für den Link
ich brauche das jedoch genau anders herum.
Das Perl Script stammt nicht von mir. Ich möchte aber auf ein paar Variablen von diesen Script zugreifen.
Wäre dann das etwas für dich?
lg Flo