dedlfix: wie funktioniert eine Callback-Funktion?

Beitrag lesen

Hi!

Ich schreibe die Ausgabe im Moment so:
echo meineFunktion(nl2br(htmlspecialchars($_POST['input'])));

Das wusste ich nicht, dass du das schon vorher machst. In dem Fall brauchst du dann doch kein Callback, weil du nun nur noch ein einfaches Einfügen beim Ersetzen benötigst und kannst wieder zum einmaligen Aufruf von preg_replace() mit zwei Arrays übergehen. Allerdings ist das dann stets davon abhängig, dass die Daten schon vorher ge-htmlspecialchars()t wurden, was du beim Wiederverwenden in anderen Projekten berücksichtigen musst. Für sauberer hielte ich es, wenn du bei der Callback-Methode inklusive htmlspecialchars() bliebest, dafür das vorhergehende htmlspecialchars() raushaust und das nl2br() anschließend anwendest. Für jetzt jedenfalls führen dich beide Methoden sicher ans Ziel.

// für i, u, b

$result = preg_replace_callback(REGEXP, 'iub', $string);
function iub($array){
    // hier müsste ich jetzt wohl irgendwie prüfen ob i, u oder b
}

  
Nee, "einfach" im Muster eine Gruppe einfügen und die verwenden.  
  
\[([uib])([^[]\*)\[/[uib]]  
  ^     ^  
  
Wobei ich jetzt grade beim Musterzusammenbau sehe, dass nun auch [u]...[/i] passt, was nicht sein soll. Also müsstest du zwar einzeln prüfen aber die gleiche Callback-Funktion nehmen:  
  
\[(u)]([^[]\*)\[/u]  
  ^ ^  
  
und das dann auch noch für i und b.  
  
Somit hast du nun zwei Gruppen, wovon die erste (markierte) je nach Muster u, i oder b enthält und die zweite den zu formatierenden Text.  
  

> Ich hab gerade gemerkt, dass deine RegExp anders aussieht als meine.  
> Deine:  
> `'#\[url=([^]]*)]([^[]*)\[/url]#'`{:.language-php}  
> Meine:  
> `"#\[link=(.*?)\](.*?)\[/link\]#si"`{:.language-php}  
>   
> Da ich nicht so fit damit bin und meine RegExp immer mit mehr Glück als Verstand zusammen schustere würde ich gern wissen wo da jetzt genau die Unterschiede liegen. Ich geh davon aus, dass deine die 'bessere' ist.  
  
Nicht unbedingt, es ist nur ein anderer Weg. Du verwendest ein ? um die Suche ungierig zu gestalten, ich nehme "alles was kein Abschlusszeichen ist".  
  
Beispiel am Ausschnitt: \[url=([^]]\*)]  
  
\[url= dürfte klar sein.  
( Gruppenanfang  
[ Zeichenklassenanfang  
^ ein ^ als erstes Zeichen ist eine Negation  
] Ein ]. [Wenn das \] als erstes nach dem \[ oder ^ steht, muss man es nicht maskieren](http://www.php.net/manual/en/regexp.reference.squarebrackets.php).  
] Ende der Zeichenklasse  
\* beliebig viele  
) Gruppenende  
] danach soll ein ] stehen  
  
Die Zeichenklasse bedeutet hier "alles was kein ] ist" und passt damit auf alles zwischen [url= und dem nächsten auftretenden ] und ist damit auch ungierig.  
  
Von den Modifizierern kann man das s weglassen, weil ja bei meinem Muster kein . enthalten ist, für den es wirksam wäre. Das case\_insensitive-i müsste auch bei meinem noch hinzukommen, damit es auf die Groß-/Klein-Schreibweise der BB-Tags wirken kann.  
  
  
Lo!