Zur Boardunity Forenstartseite
  #1  
Alt 30.10.2004, 19:56
Benutzerbild von Fabchan
früher Dracaelius
 
Registriert seit: 10.2003
Ort: Seesen
Beiträge: 354

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?
__________________
Fabian Michael
"Ein Tag, an dem du nicht lächelst, ist ein verlorener Tag."
- Charlie Chaplin

Wiki
  #2  
Alt 30.10.2004, 23:50
Benutzerbild von LonelyPixel
UNB-Entwickler
 
Registriert seit: 01.2004
Ort: Erlangen
Beiträge: 974
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?!?)

__________________
Yves Goergen
Softwareentwicklung, Fotografie, Webhosting, UNB Components (in Arbeit)
  #3  
Alt 31.10.2004, 13:48
Benutzerbild von Fabchan
früher Dracaelius
 
Registriert seit: 10.2003
Ort: Seesen
Beiträge: 354
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!

__________________
Fabian Michael
"Ein Tag, an dem du nicht lächelst, ist ein verlorener Tag."
- Charlie Chaplin

Wiki
  #4  
Alt 31.10.2004, 23:38
Benutzerbild von Fabchan
früher Dracaelius
 
Registriert seit: 10.2003
Ort: Seesen
Beiträge: 354
Juhu, ich bin doch noch fündig geworden und zwar bei Smarty:

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

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

__________________
Fabian Michael
"Ein Tag, an dem du nicht lächelst, ist ein verlorener Tag."
- Charlie Chaplin

Wiki
  #5  
Alt 01.11.2004, 00:01
Benutzerbild von LonelyPixel
UNB-Entwickler
 
Registriert seit: 01.2004
Ort: Erlangen
Beiträge: 974
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 \\\\

__________________
Yves Goergen
Softwareentwicklung, Fotografie, Webhosting, UNB Components (in Arbeit)
  #6  
Alt 01.11.2004, 00:05
Benutzerbild von LonelyPixel
UNB-Entwickler
 
Registriert seit: 01.2004
Ort: Erlangen
Beiträge: 974
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.

__________________
Yves Goergen
Softwareentwicklung, Fotografie, Webhosting, UNB Components (in Arbeit)
  #7  
Alt 01.11.2004, 19:10
Benutzerbild von Fabchan
früher Dracaelius
 
Registriert seit: 10.2003
Ort: Seesen
Beiträge: 354
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!

__________________
Fabian Michael
"Ein Tag, an dem du nicht lächelst, ist ein verlorener Tag."
- Charlie Chaplin

Wiki
  #8  
Alt 01.11.2004, 19:53
Benutzerbild von LonelyPixel
UNB-Entwickler
 
Registriert seit: 01.2004
Ort: Erlangen
Beiträge: 974
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.

__________________
Yves Goergen
Softwareentwicklung, Fotografie, Webhosting, UNB Components (in Arbeit)
Antwort


Stichworte
-

Themen-Optionen
Thema bewerten
Thema bewerten:

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.
Gehe zu






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