Hackerboard Wiki HaboBlog
Hackerboard bei Facebook Hackerboard bei Google+ Hackerboard bei Twitter

[HaBo]

 
(Web-) Design und webbasierte Sprachen Tipps & Tricks, Designabgleich, HTML & Javascript, Flash, ASP, PHP, Perl/CGI...

regexp frage

Diskussion: regexp frage im Forum (Web-) Design und webbasierte Sprachen, in der Kategorie Web, Network & Multimedia Palace; Anzeige Hi, Habe folgendes in einem String: Code: Test [$variable:blalba] oder auch [funktion blabla] Ich will den Ihnalt in den ...

Antwort
Alt 03.05.07, 23:23   #1 (permalink)
 
Registriert seit: 15.12.05
vis.p Leistung: Facit NTK
vis.p eine Nachricht über ICQ schicken
Likes: 0
Standard regexp frage

Anzeige

Hi,

Habe folgendes in einem String:

Code:
Test [$variable:blalba] oder auch [funktion blabla]
Ich will den Ihnalt in den eckigen Klammern bekommen.

Meine bisheige regexp sieht so aus:
PHP-Code:
$regexp '#[\\\]*\[([\x00-\x5C\x5E-\xFF]*[^\\\]]*)\]#';
$string preg_replace_callback($regexp"callback"$string); 
Also darf in der Klammer alles bis auf "]" (entspricht \x5D) sein. Gut nun hätte ich aber gerne die Möglichkeit die eckigen Klammern zu escapen sprich \] nicht als Ende des Bereichs zu sehen. Dafür ist der letzte Teil da (also das [^\\\]]* ).
Klarerweise darf ein escaptes \] hier nur am Ende der Klammern stehen, es soll aber überall stehen dürfen.

Hoffe ihr verzeiht mir die lange Erklärerei ;)
Wie baue ich also das ^\\\] in die erste Charactergruppe so ein, dass so ein \] überall stehen darf?

Habe es schon mit Dingen wie
[^\\\]\x00-\x5C\x5E-\xFF]*
probiert, aber da scheitert es scheinbar daran, dass \ und ] ja 2 Zeichen sind; Ich müsste die irgendwie zusammenfassen können...in der PHP-Dokumentation habe ich darüber aber nichts finden können (http://at2.php.net/manual/de/referen...ern.syntax.php)

Hoffe ihr wisst Rat.

mfg
visp
vis.p ist offline   Mit Zitat antworten
Alt 04.05.07, 00:24   #2 (permalink)
Administrator
 
Benutzerbild von Mackz
 
Registriert seit: 02.10.01
Mackz Leistung: Pentium IMackz Leistung: Pentium I
Likes: 30
Standard RE: regexp frage

Zitat:
Original von vis.p
Ich will den Ihnalt in den eckigen Klammern bekommen.
Wieso nicht einfach so?
PHP-Code:
$string="Test [$variable:blalba] oder auch [funktion blabla]";

preg_match_all('#\[(.*)\]#Um'$string$ausgabe);


print_r($ausgabe[1]); 
__________________
RL sux big time... auch 2012!

Deleting pr0n is like killing your best friend

[HaBo] bei Facebook - Werde Fan
Mackz ist offline   Mit Zitat antworten
   
HaBOT
 
- Anzeige -

Werbung ist gerade online    
Alt 04.05.07, 00:38   #3 (permalink)
LX
Moderator
 
Registriert seit: 14.02.06
LX Leistung: Z3
LX eine Nachricht über ICQ schicken LX eine Nachricht über AIM schicken LX eine Nachricht über Yahoo! schicken
Likes: 21
Arrow

Also RegExen sind schon eine dolle Sache, man hackt ein paar Sonderzeichen in die Tastatur und es kommt ein gültiger Ausdruck raus. Nur lesen kann's keiner...

Naja, Spaß beiseite, ich würde die Ausdrücke aber zumindest so einfach wie möglich fomulieren. Bei deinem komischen Ausdruck fange ich nicht mal an zu versuchen, da durchzusehen. Wenn du lediglich Inhalte in eckigen Klammern matchen willst, dann geht's das auch ganz primitiv mit einer Zeichenklasse "alles außer ...":

PHP-Code:
preg_replace '#\[([^\]]*)\]#'$wodurch$worin ); 
oder alternativ auch mit dem ungreedy-Modifier, wie Mackz sagt.

Nun willst du innerhalb der Klammer also auch noch eckige Klammern erlauben, solange sie denn escapet sind. Das wird so einfach nix, da du eben eine Bedingung einbauen müsstest, dass ein bestimmtes Zeichen nur erlaubt ist, wenn ein anderes direkt davor kommt.

Als pragmatische Lösung würde ich hier einfach wählen, dass du alle Zeichenketten '\]' vor dem preg_replace_callback()-Aufruf durch ein anderes Zeichen ersetzt, welches sonst in dieser Zeichenkette nicht vorkommen darf. In etwa so:

PHP-Code:
$string="Test [$variable:bla\]lba] oder auch [funktion blabla]";

$temp_string str_replace '\]''§'$string );

preg_replace_callback '#\[([^\]]*)\]#''callback'$temp_string); 
In der Callback-Funktion kannst du das ganze dann ja zurücksubstituieren.
__________________
"Ever tried. Ever failed. No matter.
Try again. Fail again. Fail better."
- Samuel Beckett

JS BB LX UP
LX ist offline   Mit Zitat antworten
Alt 04.05.07, 01:54   #4 (permalink)
 
Registriert seit: 20.03.07
System.I/O Leistung: Facit NTK
System.I/O eine Nachricht über ICQ schicken
Likes: 0
Standard

Moinsen,

statt dem schon erwähnten str_replace verfahren könnte man auch die dafür gedachten regex funktionen nutzen

Code:
(?<!xxx)
Negiert das angegebene Pattern und wirkt sich auf das nachfolgende aus.

Beispiel: (?<!text1)text2
Trifft auf eine Zeichenkette zu, die "text2" enthält, aber nur, wenn "text1" nicht davor kommt.
sollte dann so aussehen:
Code:
\[(.*?)(?<!\\)\]
ps: (.*) verhält sich gierig, ist als für diesen zweck nicht zu gebrauchen. (.*?) ist hier nötig.

MfG
System.I/O ist offline   Mit Zitat antworten
Alt 04.05.07, 19:16   #5 (permalink)
Themenstarter
 
Registriert seit: 15.12.05
vis.p Leistung: Facit NTK
vis.p eine Nachricht über ICQ schicken
Likes: 0
Standard

Hi,
vielen Dank für die Antworten

Ich hab jetzt folgende Regexp genommen:
Code:
$regexp ='#[\\\]*\[(.*?)(?<!\\\)\]#s';
$string = preg_replace_callback($regexp, "callback", $string);
Hab bei der regexp am Ende noch die Option s (PCRE_DOTALL) eingefügt, dass der Punkt auch newline "matched".

mfg visp
vis.p ist offline   Mit Zitat antworten
Antwort
   
- Anzeige -

Werbung ist gerade online    

[HaBo] » Web, Network & Multimedia Palace » (Web-) Design und webbasierte Sprachen » regexp frage
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[RegExp] BBCode - [code]-Blöcke rami (Web-) Design und webbasierte Sprachen 2 10.06.09 14:56
RegExp Replacer Standardconsole App Friedrich Applikationen 7 31.01.08 17:48
[SOLVED!] MySQL REGEXP und das escapen runder Klammern.... beavisbee (Web-) Design und webbasierte Sprachen 0 07.11.07 19:32
JAVA: RegExp Serow Code Kitchen 2 26.02.07 00:35


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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61