2016-12-26 6 views
0

Ich arbeite an einer "shortcode" -Funktion, um Inhalt in Text zu ersetzen, der in der Datenbank gespeichert wird.PHP regulärer Ausdruck, um Inhalt innerhalb von Klammern zu ersetzen

Ich versuche, alle Vorkommen von etwas in Doppelklammern zu finden {{ }}, sehen, ob ein Ersatz existiert, und wenn ja, ersetzen Sie es. Ich bin schlecht auf regex und ich weiß nicht, ob dies der effizienteste Weg ist, dies zu tun:

$string = "This is a {{test}} to see if it {{works}}"; 
$regex = ""; // Unfortunately, I'm clueless when it comes to regex 

preg_match_all($regex, $string, $matches); 

$replacements = array(
    'test' => 'sample', 
    'works' => 'exists' 
); 

foreach ($matches as $match) { 

    if (array_key_exists($match, $replacements)) { 
     $string = str_replace($match, $replacements[$match], $string);   
    } 

} 

return $string; 

In diesem Beispiel würde ich gerne zurückkehren:

This is a sample to see if it exists

I Ich würde gerne vorsehen, wenn der "shortcode" nicht existiert, einfach im Inhalt wie er ist zu belassen.

+1

Sie können Ihre Ausdrücke testen [hier] (https://regex101.com/). Wenn Ihre Ersetzungen jedoch so einfach sind wie im Beispiel, dann verwenden Sie 'str_replace()' (nur Klammern an Nadeln). Ansonsten würde ich 'preg_replace_callback()' in diesem Fall verwenden. – shudder

+0

dies ist regex ''/\\\\\\\\\\\\\\\\\\\\\\"> – Robert

+0

@JROB, wenn dies für die Verarbeitung von Shortcodes Zweck ist, können Sie meine Shortcode-Bibliothek verwenden: https://github.com/thunderer/ Shortcode mit Standard-Handler und benutzerdefiniertem Syntax-Objekt, das alles nach dem gewünschten Array erkennt und ersetzt. –

Antwort

1

Sie könnten tun:

$string = "This is a {{test}} to see if it {{works}}"; 
$regex = "|\{\{(.*)\}\}|"; 

$replacements = [ 
'test' => 'sample', 
'works' => 'exists' 
]; 

preg_replace_callback($regex, function($matches) use($replacemnets) { 
    if (isset($replacements[$matches[0]]) { 
    return $replacements[$matches[0]; 
    } 
    else { 
    return $matches[0]; 
    } 
}, $string); 
1

Wenn Sie im Voraus wissen, die Schlüsselwörter in doppelten Klammern enthalten, brauchen Sie nicht einmal reguläre Ausdrücke. Ein einfacher Anruf str_replace() ist genug:

$string = "This is a {{test}} to see if it {{works}}"; 

$replacements = array(
    '{{test}}' => 'sample', 
    '{{works}}' => 'exists', 
); 

$text = str_replace(array_keys($replacements), array_values($replacements), $string); 

Aber wenn Sie alle Schlüsselwörter ersetzen möchten, auch diejenigen, die Sie haben kein Ersatz für die reguläre Ausdrücke unvermeidbar und die Funktion preg_replace_callback() kommt zur Rettung:

$string = "This is a {{test}} to see if it {{works}}"; 

$replacements = array(
    '{{test}}' => 'sample', 
    '{{works}}' => 'exists', 
); 

$text = preg_replace_callback(
    '/\{\{[^}]*\}\}/', 
    function (array $m) use ($replacements) { 
     return array_key_exists($m[0], $replacements) ? $replacements[$m[0]] : ''; 
    }, 
    $string 
); 

da { und }special characters in reguläre Ausdrücke sind, müssen sie escaped sein, um als normale Zeichen interpretiert zu werden (und ignorieren ihre besondere Bedeutung).

Der anonymous function (der Rückruf) wird jedes Mal aufgerufen, wenn die Regex einem Teil der Zeichenfolge entspricht. $m[0] enthält immer den Teil der Zeichenfolge, der der gesamten Regex entspricht. Wenn die Regex subpatterns enthält, sind die Stringteile, die mit den einzelnen Teilmustern übereinstimmen, innanan verschiedenen Positionen verfügbar. In dem von uns verwendeten Ausdruck gibt es kein Untermuster, enthält einen einzelnen Wert im Index 0.

Der vom Rückruf zurückgegebene Wert wird als Ersatz für den Teil der Zeichenfolge verwendet, der dem gesamten Ausdruck entspricht.

Verwandte Themen