behalx
Avatar behalx
Themenersteller
Fortgeschrittener (61 Beiträge)

Reguläre Ausdrücke: Submuster gruppieren

am 23.06.2011, 15:33 Uhr eröffnete behalx folgenden Thread
PHP & MySQL    1571 mal gelesen    9 Antwort(en).

Folgendes Szenario: Ich will bestimmte Wörter (z.B. String oder System) fett markieren, aber dieser Wörter müssen sich innerhalb geschweifter Klammern befinden. Beispiel:


class HalloString {
public static void main(String[] args) {
System.out.println("Hallo, Welt!");
}
}


(Hallo + ) String sollte nicht fett markiert werden, aber String (+ []) schon. Ich habe es so versucht:


$reg = '/(\{)(.*)(String)(.*)(\})/';
$rep = '\$1\$2\$3\$4\$5';
$code = preg_replace($reg, $rep, $code);


aber es klappt nicht. Kennt jmd. eine Lösung? Vll. mit Hilfe von Submustern?


http://unics.bplaced.net/

joerg
Avatar joerg
Fachinformatiker Anwendungsentwicklung
Content Gott (1941 Beiträge)
am 23.06.2011, 16:38 Uhr schrieb joerg

Hallo Behalx

So würde ich das abändern.

Zeilenwechsel werden durch die Option s mit berücksichtigt.
Nicht gierige Suche müsstest du mit der Option U noch aktivieren.

Und dann musst du noch abfangen das die Klammer zwischendrin nicht geschlossen wird.

Und dann habe ich den Ausdruck mal minimiert.


$code = \'class {}HalloString {
public static void main(String[] args) {
System.out.println("Hallo, Welt!");
}
{String}{}String{}
}\';

$reg = \'/({[^}]*)(String)(.*})/Us\';
$rep = \'\\$1\\$2\\$3\';
$code = preg_replace($reg, $rep, $code);

echo $code;

Wäre das keine Alternative?

php.net/manual/de/function.highlight-string.php



Gruß
Jörg


Zufällige Umleitung zu der Startseite einer meiner Domains
Meine ungewöhnlichen Tools

behalx
Avatar behalx
Fortgeschrittener (61 Beiträge)
am 23.06.2011, 18:02 Uhr schrieb behalx

Danke. Es klappt.

Gab es einen Grund für diesen Ausdruck "({[^}]*) ..." ? Mit Hilfe von "Us" klappt es auch so:


$reg = \'/(\\{)(.*)(System|String)(.*)(\\})/Us\';
$rep = \'\\$1\\$2\\$3\\$4\\$5\';
$code = preg_replace($reg, $rep, $code);


Jedoch wird immer nur System oder String fett markiert (in beiden Versionen). Gibt es eine Möglichkeit, wie beide (bzw. noch mehr) Alternativen ersetzt werden?

joerg schrieb:

Wäre das keine Alternative?

php.net/manual/de/function.highlight-string.php




Nein. Ich programmiere zur Zeit einen Syntaxhighlighter für Java.


http://unics.bplaced.net/

joerg
Avatar joerg
Fachinformatiker Anwendungsentwicklung
Content Gott (1941 Beiträge)
am 23.06.2011, 22:49 Uhr schrieb joerg

behalx schrieb:
Gab es einen Grund für diesen Ausdruck "({[^}]*) ..." ? Mit Hilfe von "Us" klappt es auch so:



Okay aber dann wird auch so was umgewandelt. {}String{}

behalx schrieb:

Jedoch wird immer nur System oder String fett markiert (in beiden Versionen). Gibt es eine Möglichkeit, wie beide (bzw. noch mehr) Alternativen ersetzt werden?



Ist die Frage welche Schreibweise dir jetzt eher zusagt.

$syntax = array(\'String\',\'System\');
foreach ($syntax as $var)
{
$reg = \'/({[^}]*)(\'.$var.\')(.*})/Us\';
$rep = \'\\$1\\$2\\$3\';
$code = preg_replace($reg, $rep, $code);
}

//oder

$reg = array(\'/({[^}]*)(String)(.*})/Us\',\'/({[^}]*)(System)(.*})/Us\');
$rep = array(\'\\$1\\$2\\$3\',\'\\$1\\$2\\$3\');
$code = preg_replace($reg, $rep, $code);


Die Problematik rührt daher wenn in einem Bereich schon ein Austausch stattgefunden hat, das dieser mit deiner Abfrage nicht noch mal durchsucht wird.

Ich weiss jetzt nicht ob {{}String} vorkommen könnte rein theorethisch.

Wenn ja müsste man das noch mit
$reg = \'/({[^}]*[{[^}]*}]*)(String)(.*})/Us\';

abdecken können durch einen zusätzlichen Lauf mit Ersetzen. Aber bei dem regulären Ausdruck bin ich mir jetzt nicht so sicher ob es nicht noch besser geht.

Gruß
Jörg


Zufällige Umleitung zu der Startseite einer meiner Domains
Meine ungewöhnlichen Tools

matthes
Avatar matthes
Foren Moderator
Evil Genius
Content Halbgott (973 Beiträge)
am 23.06.2011, 23:17 Uhr schrieb matthes

An dieser Stelle möchte ich einmal eines meiner Lieblingstools empfehlen, es wäre wohl nirgendwo passender als hier:

gskinner.com/blog/archives/2008/03/regexr_free_onl.html



Mit diesem kleinen Helferlein wird das Level von Herumprobieren und Umstellen von "frustrierend" auf "ahso!" gehoben.


Make Seitenreport great again!

behalx
Avatar behalx
Fortgeschrittener (61 Beiträge)
am 24.06.2011, 00:00 Uhr schrieb behalx

Sieht interessant aus. Werde ich mir mal bei Gelegenheit anschauen.

@Jörg

Funktioniert auch nicht, da z.B. bei dem Array ("String", "System") genau ein System und ein String fett markiert werden, aber die anderen jedoch nicht. Ich habe aber jetzt eine billigere Lösung gefunden:


$reg = \'/([^\\w])(String|System)([^\\w])/\';
$rep = \'\\$1\\$2\\$3\';
$code = preg_replace($reg, $rep, $code);


Dadurch werden z.B. alle String\\w+ ignoriert, aber dafür z.B. String[] oder String nicht.


http://unics.bplaced.net/

romacron
JDev Xer
Content Gott (1224 Beiträge)
am 24.06.2011, 06:12 Uhr schrieb romacron

Hallo Matthes.

Kurz und schmerzlos. Klasse Tool. Wurde soeben in die "must have" aufgenommen.
Vielen Dank



gelöschter Benutzer
am 26.06.2011, 22:04 Uhr schrieb

Hallo,

warum baust du ihn dir selber? Nimm doch einfach den hier.

qbnz.com/highlighter/



Wenn du es trotzdem selber versuchen willst, google mal ein wenig nach Parsergeneratoren und Compilerbau. Denn das ist keine leichte Aufgabe die du da hast, Java ist doch schon recht komplex. Da die Syntax zu Validieren ... viel Spaß.

Schöne Grüße


behalx
Avatar behalx
Fortgeschrittener (61 Beiträge)
am 27.06.2011, 11:42 Uhr schrieb behalx

Wenn ich mal absolut nicht weiter weiß, werde ich mir das mal anschauen. Aber dann würde ich auch nichts mehr über reguläre Ausdrücke in PHP lernen.


http://unics.bplaced.net/

Chance
Programmierer
Guru (173 Beiträge)
am 27.06.2011, 12:42 Uhr schrieb Chance

Meine Empfehlung: regexp-tester.mediacix.de .


  • 1


« zurück zu: PHP & MySQL

Das Seitenreport Forum hat aktuell 5277 Themen und 36111 Beiträge.
Insgesamt sind 48343 Mitglieder registriert.