Ich bin offensichtlich zu blond um PHP preg_replace umzustellen..

holm

Well-Known Member
Ich bin offensichtlich hier zu blöd, kann mir mal Einer unter die Arme greifen bitte?

Code:
$string = preg_replace("#\[noparse\](.+?)\[/noparse\]#ise", "preg_replace('#\[#is', '[', '\\1')", $string);

..ist der alte Code eines Forums, soll "noparse" Tags organisieren. preg_replace mit option "e" ist deprecated und soll durch preg_replace_callback ersetzt werden, ich bin aber kein PHP Guru, demzufolge gehts nicht:

Code:
$string = preg_replace_callback("#\[noparse\](.+?)\[/noparse\]#is",
  function($string)
  {
  return preg_replace('#\[#is', '[', '\\1');
  },
  $string);

..was mache ich falsch?

Gruß,
Holm
 
In der Callback Funktion bezieht sich "\\1" nicht mehr auf den ersten Callback des ersten preg_replace. Es wird ja nur die Variable $string an die function übergeben.

Hab's nicht probiert, aber ungefähr so müsste es klappen (analog Example #1 der PHP Doku)

Code:
$string = preg_replace_callback("#\[noparse\](.+?)\[/noparse\]#is",
  function($matches)
  {
  return preg_replace('#\[#is', '[', $matches[0]);
  },
  $string);
 
...das hatte ich so auch schon mit $m stat $matches, aber es matcht nicht.

Mal gucken ob ich as hier escaped bekomme...
Code:
sieht so aus:

{noparse}{code} 23456778 {/code}{/noparse}

sollte aber so aussehen:

{code} 23456778 {/code}

Die "noparse" Tags werden nicht entfernt.


(. ich bekomme das Tag Parsing hier nicht abgeschaltet...
..ich habe deshalb die eckigen Klammern hier durch geschweifte ersetzt.)

Gruß,

Holm
 
Du nutzt als Parameter für den Callback den gesamten Treffer inkl. Suchmuster ($matches[0]) du willst aber den ersten Teffer, also musst du $matches[1] in dem Callback manipulieren. Siehe dazu die Dokumentation zu preg_match().

Rob
 
Code:
sieht so aus:

{noparse}{code} 23456778 {/code}{/noparse}

sollte aber so aussehen:

{code} 23456778 {/code}
Wo kommt den das "code" her? Deine Ersetzung sorgt doch nur dafür das die beginnende eckige Klammer durch das Zeichen "[" ersetzt wird...

Ansonsten: Wenn das wirklich immer eine ganz bestimmte Zeichenkette ist und die immer ersetzt werden soll, würde ich die einfach 2x mit str_replace behandeln. Also z.B.
Code:
string = str_replace('{noparse}','{code}',$string);
string = str_replace('{/noparse}','{/code}',$string);

Denn die PHP-Doku sagt wegen der Performance: "If you don't need fancy replacing rules (like regular expressions), you should always use this function instead of preg_replace()."

Du nutzt als Parameter für den Callback den gesamten Treffer inkl. Suchmuster ($matches[0]) du willst aber den ersten Teffer, also musst du $matches[1] in dem Callback manipulieren.
Stimmt
 
matches[1] scheint zu funktionieren, ihr habt also da Recht.
Das {code} habe ich händisch eingetippert und das sollte mit {noparse} maskiert werden so das es halt nicht geparst wird. Das ist also nicht immer gleich sondern der von Usern eingehebelte Text mit BBCode Tags.
Es geht um die Forensoftware von Jogis-Röhrenbude (falls die Jemand kennt) ich bin dabei das auf einen anderen Server umzuziehen und php hat sich halt in der Zwischenzeit etwas verändert. Das ist nicht die letzte Ecke an der es klemmt, ich melde mich bestimmt noch mit weiteren solchen Anfragen, bin aus der PHP Programmiererei schon ein paar Jahre raus.

das war früher mal die Parsimony Forensoftware (my little Forum) ist aber in der Zwischenzeit mal heftig überarbeitet und auf SQL umgebaut worden von Jemandem der da wohl jetzt keine rechte Lust mehr dazu hat..

Habt Dank einstweilen!
Gruß,

Holm
 
Zurück
Oben