2012-10-29 14 views
6

Ich versuche, meinen Client die Möglichkeit zu geben, eine Funktion, die verschiedene Code-Snippets hat, durch einen kurzen Code in ihrem WYSIWYG-Editor eingefügt.PHP ersetzen regulären Ausdruck anstelle von Zeichenfolge ersetzen

Zum Beispiel werden sie so etwas wie schreiben ...

[getSnippet(1)] 

Das ist mein getSnippet nennen ($ id) PHP-Funktion und geben die entsprechenden 'Brocken'.

Es funktioniert, wenn ich hart Code der $ id so ...

echo str_replace('[getSnippet(1)]',getSnippet(1),$rowPage['sidebar_details']); 

Aber ich möchte wirklich dynamisch die '1' machen. Ich bin irgendwie auf dem richtigen Weg mit so etwas wie ...

function getSnippet($id) { 
if ($id == 1) { 
    echo "car"; 
} 
} 

$string = "This [getSnippet(1)] is a sentence.This is the next one."; 
$regex = '#([getSnippet(\w)])#'; 
$string = preg_replace($regex, '. \1', $string); 

//If you want to capture more than just periods, you can do: 
echo preg_replace('#(\.|,|\?|!)(\w)#', '\1 \2', $string); 

Nicht ganz :(

+0

Was funktioniert nicht mit Ihrem Code? – hakre

+0

Schau dir 'preg_replace_callback()' an. Sie können eine Funktion angeben, die die Bits der Zeichenfolge empfängt, die von einer regulären Ausgabe abgeglichen wurden, und die Ersetzung zurückgibt. – Barmar

Antwort

0

Zum einen in Ihrem regex arbeiten Sie wörtliche Klammern (diejenigen hinzufügen müssen Sie nur erfassen haben \w aber das wird nicht die Klammern selbst) entsprechen:

$regex = '#(\[getSnippet\((\w)\)\])#'; 

ich entkam auch die eckigen Klammern, sonst werden sie eine Zeichenklasse öffnen sich auch darüber im Klaren sein, dass dies nur ein Zeichen für den Parameter erfasst

.!

Aber ich empfehle Sie verwenden preg_replace_callback, mit einem regulären Ausdruck wie folgt aus:

function getSnippet($id) { 
    if ($id == 1) { 
     return "car"; 
    } 
} 

function replaceCallback($matches) { 
    return getSnippet($matches[1]); 
} 

$string = preg_replace_callback(
    '#\[getSnippet\((\w+)\)\]#', 
    'replaceCallback', 
    $string 
); 

Bitte beachte, dass ich die echo in Ihrem getSnippet zu einem return geändert.

Innerhalb des Rückrufs enthält $matches[1] die erste erfasste Gruppe, die in diesem Fall Ihr Parameter ist (der jetzt mehrere Zeichen zulässt). Natürlich könnten Sie auch getSnippet Funktion einstellen, um die id aus dem $matches Array zu lesen, anstatt durch die replaceCallback Umleitung.

Aber dieser Ansatz ist hier etwas flexibler, da Sie auf mehrere Funktionen umleiten können. Wenn Sie zum Beispiel die Regex in #\[(getSnippet|otherFunction)\((\w+)\)\]# geändert haben, dann könnten Sie zwei verschiedene Funktionen finden, und replaceCallback könnte den Namen der Funktion in $matches[1] herausfinden und die Funktion mit dem Parameter $matches[2] aufrufen. Gefällt mir:

function getSnippet($id) { 
    ... 
} 

function otherFunction($parameter) { 
    ... 
} 

function replaceCallback($matches) { 
    return $matches[1]($matches[2]); 
} 

$string = preg_replace_callback(
    '#\[(getSnippet|otherFunction)\((\w+)\)\]#', 
    'replaceCallback', 
    $string 
); 

Es hängt wirklich davon ab, wohin Sie damit gehen wollen. Wichtig ist, dass es keine Möglichkeit gibt, einen beliebigen Parameter in einem Ersatz zu verarbeiten, ohne preg_replace_callback zu verwenden.

+0

Vielen Dank für eine schnelle Antwort. Dies scheint zu diesem Zeitpunkt sehr eng zu sein. Wenn ich eine Zeichenfolge wie ... '$ string =" [getSnippet (1)] diese ijioj oiajs dfoij dsofij aoisfj oiasdfj. [GetSnippet (2)] adfas asd als f. ";' Ich bin nur Erhalten des Textes von der Funktion zurückgegeben, aber den anderen Text verloren ... 'ie: Auto. Boot.' Aber es sollte ... ' "Car. Dieses ijioj oiajs dfoij dsofij aoisfj oiasdfj. Boot. Adfas asd als f." ' Nochmals vielen Dank. –

+0

Ihre Antwort funktioniert so, wie ich es möchte, außer dass der Rest des Textes in meinem Satz entfernt wird. Nur der von den Funktionsaufrufen zurückgegebene Text bleibt erhalten. Danke noch einmal. –

+0

Bitte ändern Sie das 'echo' in' getSnippet' in ein 'return'. Ich dachte, ich hätte das geändert, aber anscheinend habe ich dort einen Kopierfehler gemacht. –

Verwandte Themen