MyBB.de Forum
Reguläerer Ausdruck -> Fehler... - Druckversion

+- MyBB.de Forum (https://www.mybb.de/forum)
+-- Forum: Sonstiges (https://www.mybb.de/forum/forum-1.html)
+--- Forum: Programmierung (https://www.mybb.de/forum/forum-32.html)
+--- Thema: Reguläerer Ausdruck -> Fehler... (/thread-13830.html)



Reguläerer Ausdruck -> Fehler... - Megaleecher - 11.07.2009

Hi Leute...
Ich weis echt nicht mehr weiter.

In einen meiner neuesten Plugins benutze ich die myBB interne Funktion find_replace_templatesets().
Diese funktioniert auch sehr gut jedoch nicht immer...

Ich habe folgendes genommen, er entfernt mir aber den Text nicht.
PHP-Code:
find_replace_templatesets("forumbit_depth1_cat"'#<div id=\"Tab_{\$forum[\'fid\']}\" class=\"singleTab\">(\r?)\n#i'""0); 

Zum hinzufügen habe ich folgendes geschreiben:
PHP-Code:
find_replace_templatesets("forumbit_depth1_cat"'#<table#si'"<div id=\"Tab_{\$forum['fid']}\" class=\"singleTab\">\n<table"); 

Das hinzufügen klappt prima jedoch bekomme ich das hinzugefügt einfach nicht mehr weg...

Sieht irgendwer, was ich da falsch mache??
Wäre über jede Hilfe dankbar Wink

MfG Megaleecher


RE: Reguläerer Ausdruck -> Fehler... - frostschutz - 11.07.2009

Wenn das ein regulärer Ausdruck ist, und du Zeichen mit Sonderbedeutung ($ Zeilenende, [] Zeichengruppe, {} Anzahl usw.) benutzen willst, musst du sie escapen. Am einfachsten mit preg_quote().

Also '#'.preg_quote('bla $ fasel []').'#i' oder so.

Den $ hattest du in deinem Beispiel schon escaped obwohl das in ' nicht nötig sein sollte. Für reguläre Ausdrücke dagegen schon nötig (solltest du dann aber \\ schreiben damit der \ auch im String und damit bei preg_replace ankommt).

Hilft das?


RE: Reguläerer Ausdruck -> Fehler... - Megaleecher - 11.07.2009

Danke für diese ausführliche Antwort.
Hat mir sehr geholfen Wink

Die eckige Klammer war der Hund^^

Die geschwungene KIammer stört ihm nicht.

Das mit preg_quote werd ich mir mal ansehen, sihet ja sehr vielversprechend aus.

Was meinst du mit \\ damit der einfach ankommt??

Das versteh ich nciht...

Was ich auch komisch finde wieso brauche ich \\\\ um einen einfachen \ wegzubekommen??
Das haben wir zwar in der Schule gelernt, ich checks aber einfach nicht...

MfG Megaleecher


RE: Reguläerer Ausdruck -> Fehler... - frostschutz - 11.07.2009

Naja, das was du in die PHP Datei schreibst, das sieht erstmal der PHP-Parser. Der macht dann wenn er "blafasel" sieht einen String mit dem Wert blafasel daraus.

In der PHP Datei muss man Zeichen escapen können, um einen String mit dem Wert " schreiben zu können, dazu schreibst du "\"". Der \ wird vom Parser ausgewertet, ist nicht Teil des Strings, der String besteht aus nur einem Zeichen, ".

D.h. der Parser schluckt schon mal ein \. Um einen String mit dem Wert \ zu schreiben muss du "\\" schreiben.

Wenn du nun einen String einer Funktion übergibst, die ihrerseits Escapes sehen will, musst du halt auf einmal "\\\\" schreiben, um einen String mit dem Wert \\ zu erzeugen, der von der Funktion wiederum - weil sie selbst escapes auswertet - auf \ reduziert wird, sprich die Regexp matcht dann einen einzelnen \ in diesem Fall.

Das kann dann stellenweise ziemlich eklig werden, ich musste auch schon mal \\\\\\\\\\\\\\\\ schreiben. Wink

Wobei man bei PCRE alternativ auch mit \Q und \E (geschrieben als \\Q \\E) arbeiten kann. Was die Regexp unleserlicher macht ist situationsabhängig.


RE: Reguläerer Ausdruck -> Fehler... - Megaleecher - 19.07.2009

Oh mann...

Ich bin schon fast am verzweifeln...
Die Ausdrücke wollen einfach nicht hinhauen...

PHP-Code:
find_replace_templatesets("index"'#{\$headerinclude}#si'"{\$headerinclude}\n{\$tabs_headerinclude}");
    
find_replace_templatesets("index"'#{\$footer}#si'"{\$footer}\n{\$tabs_body_onload}");
    
find_replace_templatesets("index"'#{\$forums}#si'"{\$tabs_prefix}\n{\$forums}\n{\$tabs_postfix}"); 

und dann noch diese:
PHP-Code:
    find_replace_templatesets("index"'#{\$tabs_headerinclude}(\r?)\n#si'""0);
    
find_replace_templatesets("index"'#(\r?)\n{\$tabs_body_onload}#si'""0);
    
find_replace_templatesets("index"'#{\$tabs_prefix}(\r?)\n#si'""0);
    
find_replace_templatesets("index"'#(\r?)\n{\$tabs_postfix}#si'""0); 

Was ich so merkwürdig finde ist, dass er das $tabsheaderinclude ohne Probleme hinzufügt und entfernt...
Nur die anderen wollen einfach nicht.
Ich weis einfach nicht mehr weiter bzw. was ich da falsch mache...

Hoffentlich findet sihc wer, der mir da helfen kann Wink

MfG Megaleecher


RE: Reguläerer Ausdruck -> Fehler... - StefanT - 20.07.2009

Probiere:
PHP-Code:
find_replace_templatesets("index"'#'.preg_quote('{$headerinclude}').'#si'"{\$headerinclude}\n{\$tabs_headerinclude}");
    
find_replace_templatesets("index"'#'.preg_quote('{$footer}').'#si'"{\$footer}\n{\$tabs_body_onload}");
    
find_replace_templatesets("index"'#'.preg_quote('{$forums}').'#si'"{\$tabs_prefix}\n{\$forums}\n{\$tabs_postfix}"); 



RE: Reguläerer Ausdruck -> Fehler... - Megaleecher - 20.07.2009

Es funktioniert noch immer nicht...

Er ersetzt nur das $tabs_headerinclude...
Die anderen werden einfach nicht ersetzt...

Hier mal das Template index wo die Regulären Ausdrücke angewendet werden:
PHP-Code:
<html>
<
head>
<
title>{$mybb->settings['bbname']}</title>
{
$headerinclude}
{
$overview_headerinclude}
<
script type="text/javascript">
<!--
    
lang.no_new_posts "{$lang->no_new_posts}";
    
lang.click_mark_read "{$lang->click_mark_read}";
// -->
</script>
</
head>
<
body>
{
$header}
{
$overview}
{
$forums}
{
$boardstats}

<
dl class="forum_legend smalltext">
    <
dt><img src="{$theme['imgdir']}/on.gif" alt="{$lang->new_posts}title="{$lang->new_posts}style="vertical-align: middle; padding-bottom: 4px;" /></dt>
    <
dd>{$lang->new_posts}</dd>

    <
dt><img src="{$theme['imgdir']}/off.gif" alt="{$lang->no_new_posts}title="{$lang->no_new_posts}style="vertical-align: middle; padding-bottom: 4px;" /></dt>
    <
dd>{$lang->no_new_posts}</dd>

    <
dt><img src="{$theme['imgdir']}/offlock.gif" alt="{$lang->forum_locked}title="{$lang->forum_locked}style="vertical-align: middle;" /></dt>
    <
dd>{$lang->forum_locked}</dd>
</
dl>
<
br style="clear: both" />
{
$footer}
</
body>
</
html

MfG Megaleecher