Boardunity & Video Forum

Boardunity & Video Forum (https://boardunity.de/)
-   Programmierung und Datenbanken (https://boardunity.de/programmierung-datenbanken-f23.html)
-   -   Spezieller regulärer Ausdruck gesucht! (https://boardunity.de/spezieller-regul-rer-ausdruck-gesucht-t2521.html)

Fabchan 30.10.2004 18:56

Spezieller regulärer Ausdruck gesucht!
 
Hi Leute!

Ich hab mal wieder ein Problem:

Ich brauche einen regulären Ausdruck, escapte (oder ge-"\"-te) Sonderzeichen in einem String erkennen soll:

PHP-Code:

$str 'Jedes \'Jahr\' kauft sich der "Osterhase" sogenannte "19\"-Chromfelgen" für sein Auto!'

Der Reguläre Ausdruck soll in diesem Beispielstring alles, was in einfachen oder doppelten Anführungszeichen steht, finden und ersetzen. Dabei soll er geschützte Anführungszeichen in den Strings als solche erkennen und ignorieren.

PHP-Code:

$str preg_replace('/("|\')(.*)(\\1)/ie''funktion(\'\\2\')'$str); 

funktioniert nicht, weil er keine geschützen Anführungszeichen erkennen kann, statt "(.*)" müsste ich also was anderes schreibenen. Kennt jemand eine Lösung?

LonelyPixel 30.10.2004 22:50

Versuch doch mal das hier:

preg_replace(
'_(?<!\\)("|\')(.*?)(\\1)_ie',
'funktion(str_replace('\\"', '"', "$2"))',
$str);

http://de.php.net/manual/en/referenc...ern.syntax.php -> "Assertions" (negative lookbehind assertion)

Das str_replace kommt mit rein, weil PHP den String $2 scheinbar immer eins zuviel \-t. Du kannst ja mal versuchen, es wegzulassen, und dann Strings mit ' oder " oder \ verarbeiten.

(Edit: Wieso ist eigentlich sogar das vB3 so blöd und zeigt meine führenden Leerzeichen nicht an?!?)

Fabchan 31.10.2004 12:48

Der RegExp, so wie du ihn gepostet hast, erzeugt einen Parse-Error, wenn man den diesen Fehler verursachenden Teil korrigiert, erhält man trotzdem noch eine Warnung!

PHP-Code:

<?php

$str 
'Jedes \'Jahr\' kauft sich der "Osterhase" sogenannte "19\"-Chromfelgen" für sein Auto!';
echo 
$str '<hr />';

echo 
preg_replace('_(?<!\\)("|\')(.*?)(\\1)_ie''doo(str_replace(\'\\"\', \'"\', \'\\2\'))'$str);

function 
doo($str) {
    return 
'<strong>' .  stripslashes($str) . '</strong>';
}


?>

erzeugt:

Code:

Warning: Compilation failed: lookbehind assertion is not fixed length at offset 20 in D:\apache\Apache2\htdocs\regexptest.php on line 6

EDIT:

Habe etwas gefunden, was allerdings leider mit PHP nicht zu funktionieren scheint: http://www.regexlib.com/RETester.aspx?regexp_id=355
Bei ereg bekomme ich eine Fehlermeldung, bei preg-Funktionen funktionieren die geschützen Anführungszeichen nicht!

Fabchan 31.10.2004 22:38

Juhu, ich bin doch noch fündig geworden und zwar bei Smarty:

"[^"\\\\]*(?:\\\\.[^"\\\\]*)*"

Vielleicht hilft es ja nochmal irgendwem, der das gleiche Problem hat!

LonelyPixel 31.10.2004 23:01

Oh, naja, nach der lookbehind Assertion sollte halt ein \ kommen. Da der einmal für PHP und einmal für preg bearbeitet verden muss, sollten es wohl 4 statt 2 sein, also \\\\

LonelyPixel 31.10.2004 23:05

Zitat:

Zitat von Dracaelius
Juhu, ich bin doch noch fündig geworden und zwar bei Smarty:

"[^"\\\\]*(?:\\\\.[^"\\\\]*)*"

Gehören die " außenrum dazu oder ist das für PHP? Wenn sie dazu gehören (ansonsten gäbe es nen PHP-Fehler), kann ich dir bereits nach dem 1. Zeichen sagen, dass das nicht das tut, was du haben willst, da es auch \" am Anfang akzeptiert. Was es stattdessen tut, kann ich nicht sagen, da mir dieser RegExp wenig sinnvoll erscheint.

Fabchan 01.11.2004 18:10

Die Anführungszeichen am Anfang und am Ende gehören zum RegEx!

Der RegEx ist übrigens für meine Template-Engine gedacht und für meine Zwecke reicht es vollkommen aus, denn wer in sein Template absichtlich Fehler einbaut, um einen PArse-Error zu erzeugen, der hat selber Schuld!

LonelyPixel 01.11.2004 18:53

Die gehören dazu. Warum braucht's da dann überall 4 \ ? Naja, du wolltest doch alle \" und \' ignorieren, oder? Also z.B. in:

text "string" bla bla \" ignore me

Und was passiert damit:

text \" bla "string" bla bla \" ignore me

Hier wird ab dem ersten " (und da steht ein \ davor) erkannt. Ob der 2. Teil auch erkannt wird, kann ich nicht sagen, das Ding ist viel zu kompliziert dafür. Naja, ich geh eh davon aus, dass du den Ausdruck noch verändern wirst, da er ja nichtmal ne sammelnde Klammer drin hat.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:19 Uhr.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25