2017-11-19 25 views
-1

に位置に基づいて動的なコンテンツを置き換える:PHPは、私が希望何列

値は{{}}間にある交換します。

入力: "これは文字は{{A}}と{{B}}"

それは変更することができます。 "これは{{AAAA}}文字であり、{{BBB}}"

with array ("C", "D")

出力:は、「これは、文字CとD


である私が事前に知っていません私はこれらの文字列を抽出し、別の値に置き換えるしたい{{}}との間の文字列:私が試した

何:

$body = "This is a body of {{awesome}} text {{blabla}} from a book."; 


//Only work if we know the keys (awesome, blabla,...) 
$text["awesome"] = "really cool"; 
$text["blabla"] = ""; 
echo str_replace(array_map(function($v){return '{{'.$v.'}}';}, array_keys($text)), $text, $body); 

結果:

This is a body of really cool text from a book. 

問題:

私は既に括弧で囲んだ古いコンテンツの前に知っているが、鉱山は「動的」であることがわかっているので、これと似たものは見つからないので、array_mapまたはpreg_replace_callbackのソリューションは機能しません。

どうすればいいですか?

+0

あなたの_actual_の問題の例は何ですか? '{{}}'の間でコードを実行したいのですが、オブジェクトや何から値を参照したいのですか? – MatsLindh

+0

置き換えたい文字列の中に '{{}}'がいくつ含まれていますか?唯一の2 –

+0

@ chris85はいそれは重複としてマークされた、私はあなたが与えたリンクを見たが、私の質問は異なる(たとえ既に尋ねられたものに似ていても、私は私の質問を投稿する前にすべての答えを読んだ、 – Julien

答えて

1

を試すことができます私は、これはあなたが後何であるかだと思います。

$body = "This is a body of {{awesome}} text {{blabla}} from a book."; 
$count = 0; 
$terms[] = '1'; 
$terms[] = '2'; 
echo preg_replace_callback('/\{{2}(.*?)\}{2}/',function($match) use (&$count, $terms) { 
    $return = !empty($terms[$count]) ? $terms[$count] : 'Default value for unknown position'; 
    $count++; 
    return $return; 
}, $body); 

デモ:https://3v4l.org/Ktaod

これは、各{{}}ペアリングを見つけ、それが文字列で発見された位置に基づいて、配列から値を値に置き換えられます。

正規表現\{{2}(.*?)\}{2}は、2つの{の間の何か、次に2 }を探しています。

+1

FYI' preg_replace_callback'には、外部カウントを使わないようにする '$ count'というオプションの第4引数がありますエル。 – revo

1
$body = "This question is a {{x}} of {{y}} within SO."; 

$text = ['possible duplicate', '@21100035']; 

echo preg_replace_callback('~{{[^{}]++}}~', function($m) use ($text, &$count) { 
    return $text[(int)$count++] ?? $m[0]; 
}, $body, -1, $count); 

// Output 
// This question is a possible duplicate of @21100035 from SO. 

Live demo

+0

しかし、私は事前にxとyを知らない – Julien

+0

@Julien:どのように '{{}}'の間の文字列で置き換えますか?もしあなたが 'xとyをあらかじめ知っていなければ ' – C2486

+0

sthgのように: array [0] ="最初の{{}} "を置き換える値; (0は分からないものを置き換えるテキストの名前を置き換えますが、私は彼の位置を知っています – Julien

0
<?php 

$body = "This question is a {{x}} of {{y}} within SO."; 

$searches = ['{{x}}', '{{y}}']; 
$replaces = ['possible duplicate', '@21100035']; 

echo str_replace($searches, $replaces, $body); 

// Output 
// This question is a possible duplicate of @21100035 from SO. 

EDIT: YOUはX & Yを知らないなら、あなたはこの

<?php 

$body = "This question is a {{x}} of {{y}} within SO."; 

preg_match_all('/\{\{(.*?)\}\}/', $body, $matches); 

$searches = $matches[0]; 
$replaces = ['possible duplicate', '@21100035']; 

echo str_replace($searches, $replaces, $body); 

// Output 
// This question is a possible duplicate of @21100035 from SO. 
+0

xとyがわかりません。質問をお読みください – Julien

関連する問題