Willkommen Gast. Bitte anmelden oder registrieren.

Autor Thema: RegEx-Problem (ich hoffe, die Frage ist hier erlaubt)  (Gelesen 2643 mal)

0 Mitglieder und 1 Gast betrachten dieses Thema.

Sammy

  • Bestätigter Nutzer
  • Beiträge: 165
RegEx-Problem (ich hoffe, die Frage ist hier erlaubt)
« am: 07. März 2012, 20:09:22 »
So, nächste Frage, die aber weder Joomla noch wirklich PHP-spezifisch ist:
Mein Content-Plugin horcht auf diese Tags im Content:
/{meinPlugIn\s*(.*?)}/iMir ist auch klar, was das im Einzelnen bewirkt, nur ist lesen ja immer leichter als schreiben....

Wie kann ich dem RegEx beibringen, dass es '\}' nicht als Schluss ansieht sondern nur '}'.
Ich möchte also die Übergabe von '}' möglich machen zu maskieren als '\}'.

Ich habe da leider ein Brett vor dem Kopf.


Edit:
Ich könnte wohl
/{meinPlugIn\s*(.*?)meinPlugIn}/ibenutzen, aber das finde ich nicht so charmant, weil der User dann noch mehr tippen muß.

Harmageddon

  • Bestätigter Nutzer
  • Beiträge: 23
    • ZweiIconKram
Antw: RegEx-Problem (ich hoffe, die Frage ist hier erlaubt)
« Antwort #1 am: 07. März 2012, 20:20:20 »
Wie wäre es damit?
/\{meinPlugIn\s(.*(?!\\))\}/i

Sammy

  • Bestätigter Nutzer
  • Beiträge: 165
Antw: RegEx-Problem (ich hoffe, die Frage ist hier erlaubt)
« Antwort #2 am: 08. März 2012, 07:56:37 »
Das kann ich erst nachher testen, nichts desto trotz wäre ich dankbar, wenn ich das verstehen würde, kann Du da noch eine Erklärung hinterher schieben?

/\{meinPlugIn\s(.*(?!\\))\}/i

Sind { und } escaped? War das Absicht?
\s -> Whitespace
.* -> beliebig viele Zeichen
(?!\\) -> ein Zeichen ausser \ -> ?


'\}' soll ja erlaubt sein, nur jede andere Komination mit '}' bzw. jedes andere Vorkommen von '}' soll 'das Ende' sein.
Nicht falsch verstehen, wenn funktioniert, dann bin ich froh, wenn ich's verstanden habe, dann noch mehr.
RegEx ist für mich immer wieder eine Herausforderung, ich brauche sie zu selten und fange jedes mal wieder fast von vorne an.

Edit:
Blöd, dass ich das aktuell nicht testen kann, aber es hat mir ja keine Ruhe gelassen. Ich bin über ein (Java-)Tester gestolpert: http://myregexp.com/
Der markiert mir selbst bei meiner Lösung zu viel, wenn nach dem eigentlichen schließenden '}' noch ein weiteres kommt, ich sollte wohl doch meine im ersten Post angegeben Alternative benutzen, hat Vorteile, wenn der Entwickler sein eigenes Wert versteht :-)

Edit-2:
Die Idee geht leider nicht. PHP mault an Stelle 24 (ohne die \ vor den Klammern bei 22).
Dafür hat PHP aber auch kein Problem mit weiteren '}' im Text (wie Java oder Link oben scheinbar).

Falls jemand noch helfen kann, dann sehr gut (das interessiert mich ja), falls nicht, dann nehme ich einfach das schließenden Tag 'meinPlugIn}'.
« Letzte Änderung: 08. März 2012, 09:18:10 von Sammy »

Harmageddon

  • Bestätigter Nutzer
  • Beiträge: 23
    • ZweiIconKram
Antw: RegEx-Problem (ich hoffe, die Frage ist hier erlaubt)
« Antwort #3 am: 08. März 2012, 11:01:44 »
{ und } sind escaped, da sie unescaped bestimmte RegEx-Ausdrücke darstellen. \s hast du reingemacht, ja, das ist ein Whitespace.
(.*) sind beliebig viele Zeichen, (.*(?!\\)) sind beliebig viele Zeichen ohne \. Und mein Ausdruck funktioniert bei mir.

Sammy

  • Bestätigter Nutzer
  • Beiträge: 165
Antw: RegEx-Problem (ich hoffe, die Frage ist hier erlaubt)
« Antwort #4 am: 08. März 2012, 13:27:28 »
Den grundsätzlichen Part habe ich wohl verstanden:
- beliebig viele Zeichen (.*)
- gefolgt von einem oder keinem Zeichen, dass kein '\' ist
- gefolgt von }
...ja, sieht sinnvoll aus. Danke.

Aber:
$regex = '/\{contender\s(.*(?!\\))\}/i';fürhrt zu einem Fehler:
Warning: preg_replace_callback() [<a href='function.preg-replace-callback'>function.preg-replace-callback</a>]: Compilation failed: missing ) at offset 24 in...

So wird keine Warnung geworfen:
$regex = '/\{contender\s(.*(?!\\))[u][b])[/b][/u]\}/i';Allerdings endet der gefundenen Text dann u.U. nicht rechtzeitig:
Denn der Content
{meinPlugIn type=fotogalerie | bild=tobedone\}mitKlammer } ...und ab hier soll der Text normal im Content erscheinen und auch eine Klammer anzeigen: '}'landet gänzlich im Plugin, auch der Teil, der nicht dazu gehört: ...und dieser Text soll normal im Content erscheinen und auch eine Klammer darstellen: '}'

Es wird als nicht beim ersten Antreffen von '}' abgebrochen. Das mag aber auch an dem ')'-Problem liegen, ich kann mir auch nicht erklären, wo die Klammer herkommen soll. Alle geöffneten sind ja schon geschlossen. Ich vermute deshalb, dass ein ')' als escaped angesehen wird.
Um sicher zu gehen: So sieht mein Code im Ganzen aus:
//$regex = '/\{meinPlugIn\s*(.*?)\}/i';
  $regex = '/\{meinPlugIn\s(.*(?!\\)))\}/i';

$article->text = preg_replace_callback($regex, array($this, "doit"), $article->text);
return true;


addi

  • Bestätigter Nutzer
  • Beiträge: 26
Antw: RegEx-Problem (ich hoffe, die Frage ist hier erlaubt)
« Antwort #5 am: 03. Juli 2012, 22:04:59 »
Hab wenig Ahnung, aber mir fällt was zur Fehlermeldung ein: Warning: preg_replace_callback() [<a href='function.preg-replace-callback'>function.preg-replace-callback</a>]: Compilation failed: missing ) at offset 24 in...

Als 24. Zeichen steht } denn der Ausdruck beginnt erst in der geschweiften Klammer. Eine runde Klammer wird nicht geschlossen, weil davor \) escaped ist und nicht zählt.

/\{

contender\s(.*(?!\\))\

} /i

Sammy

  • Bestätigter Nutzer
  • Beiträge: 165
Antw: RegEx-Problem (ich hoffe, die Frage ist hier erlaubt)
« Antwort #6 am: 09. Juli 2012, 11:56:43 »
Warum wird die runde Klammer nicht geschlossen? Das '\' ist doch escapes, also '\\', damit bezieht es sich doch gar nicht auf die Klammer?!

Vielleicht kann mir noch mal jemand auf die Sprünge helfen, ich will's einfach verstehen und isoliere mein aktuelles Problem mal:
Text:
Zitat
Text mit Klammer (}) vor Plugin {plugin pluginPfad=root\subdir pluginText=Text, auch mit schliessender, geschweifter Klammer, also '\}'} Text nach Plugin, der auch eine Klammer enthält: }

Ich suche nun das Regex, dass mir unabhängig von Anzahl und Vorhandensein weiterer '}' einfach nur mein 'Plugin-Content' liefert, also das hier:
Zitat
pluginPfad=root\subdir pluginText=Text, auch mit schliessender, geschweifter Klammer, also '\}'
btw: '\}' würde ich später durch '}' ersetzen, ergo: wenn mein Plugin ein '}' übergeben werden soll, dann ist das zu escapen.

Mein Problem ist, der schließende Part: Ein '\}' soll nicht zum Suchende führen, das erste nicht escapte '}' schon.
Der Part ist klar:
\{plugin\s.*?
aber weiter?
'bis } aber ohne \} bekomme ich nicht hin  :-\
« Letzte Änderung: 09. Juli 2012, 15:01:50 von Sammy »

bembelimen

  • moderatives Dielektrikum
  • Beiträge: 227
  • Ich kam, sah und zensierte...
    • Joomla! Vereinsverwaltung
Antw: RegEx-Problem (ich hoffe, die Frage ist hier erlaubt)
« Antwort #7 am: 09. Juli 2012, 15:57:51 »
Evtl. ist das mal eine Anfangsidee, auf die du aufbauen kannst:

{meinPlugin\s(.*|([\\][\}]))*}
Test

Wenn das Plugin mehrmals auftreten kann, musst du noch das "greedy" noch umgehen.

Sehr empfehlenswertes Programm
Joomla! ist auch nur ein Mensch...

Sammy

  • Bestätigter Nutzer
  • Beiträge: 165
Antw: RegEx-Problem (ich hoffe, die Frage ist hier erlaubt)
« Antwort #8 am: 09. Juli 2012, 16:19:26 »
Danke. Das sehe ich mir an. Ich weiß, dass ich meine Problemstellung auch anders lösen kann, aber man will ja lernen.
Bei RegEx habe ich das leider regelmäßig alle paar Monate wieder :-)

Thx!

Sammy

  • Bestätigter Nutzer
  • Beiträge: 165
Antw: RegEx-Problem (ich hoffe, die Frage ist hier erlaubt)
« Antwort #9 am: 11. Juli 2012, 10:09:03 »
Evtl. ist das mal eine Anfangsidee, auf die du aufbauen kannst:

{meinPlugin\s(.*|([\\][\}]))*}

Oder! Es kann so einfach sein.... Danke!