2016-01-27 6 views
5

В JavaScript можно определить возвратную функцию, когда вы делаете строки замены:Строка замены в PHP с функцией возврата

function miniTemplate(text, data) { 
    return text.replace(/\{\{(.+?)\}\}/g, function(a, b) { 
     return typeof data[b] !== 'undefined' ? data[b] : ''; 
    }); 
} 

Это несколько строк кода позволяют мне создать очень аккуратную систему шаблонов. Регулярное выражение соответствует всем строкам «{{something}}» внутри текстовой переменной, а функция возврата соответствует, если в объектных данных находится , а если оно есть, оно заменяет его.

Так,

text = "Hello {{var1}}, nice to meet {{var2}}"; 
data = { var1: "World", var2: "You" } 
//result => "Hello World, nice to meet You" 

Im пытается повторить это функциональность PHP, но единственное решение, которое приходит на ум использует 2 cicles, одна из которых разбора каждый элемент массива данных, а второй внутри сначала, который ищет строку внутри Text.

Есть ли более чистый способ в php?

+0

Используйте 'preg_replace_callback' –

+0

вы пытались сделать то же самое, как JS? Узнайте, что находится внутри двойных скобок и выполняет замену? – FMashiro

+0

Вы можете найти решение на основе 'preg_replace-callback()': http://php.net/manual/en/function.preg-replace-callback.php – Jan

ответ

3

Вы можете использовать preg_replace_callback точно так же, как и в JavaScript (передать массив $data на preg_replace_callback, используя ключевое слово uses):

function miniTemplate($text, $data) { 
    return preg_replace_callback('~\{\{(.*?)}}~', function ($m) use ($data) { 
     return isset($data[$m[1]]) ? $data[$m[1]] : $m[0]; 
    }, $text); 
} 
$text = "Hello {{var1}}, nice to meet {{var2}}"; 
$data = array("var1" => "World", "var2"=> "You"); 
echo miniTemplate($text, $data); // => Hello World, nice to meet You at {{var3}} 

См IDEONE demo

Если значение отсутствует в $data, строка шаблона будет возвращена, как мы сначала проверить, если он присутствует с isset($data[$m[1]]).

+0

Идеально, я предлагаю вам изменить возврат строка с возвратом (isset ($ data [$ m [1]]))?$ data [$ m [1]]: ''; в случае, если индекс отсутствует, по крайней мере, функция не прерывается. – DomingoSL

+0

Обновлен, чтобы также поддерживать недоступные данные шаблона. –

1

Для этого вы можете использовать preg_replace_callback.

Пример кода:

$result = preg_replace_callback('/\{\{(.+?)\}\}/', 'replacementFunction', $subject); 

    function replacementFunction($groups) { 
     //code login here 
     return "value"; 
    } 
1

Я думаю, что мы не должны думать сложные вещи об этой потребности. Если мы попытаемся сохранить его простым, вы можете использовать функцию sprintf для php для форматирования текста, вы можете попробовать код ниже;

<?PHP 
    $format = "Hello %s, nice to meet %s"; 
    $jsonData = "{\"var1\": \"World\", \"var2\": \"You\" }"; 
    $data = json_decode($jsonData); 
    $result = sprintf($format,$data->var1,$data->var2); 
    echo $result; 
?> 

Рабочий пример здесь https://ideone.com/AGNZen

3

Да, в PHP есть функция preg_replace_callback(), что вы можете передать функцию для работы с заменой:

$result = preg_replace_callback('/\{\{(.+?)\}\}/', 'do_replacement', $subject); 

function do_replacement($groups) { 
    // $groups[0] holds the entire regex match 
    // $groups[1] holds the match for capturing group 1 
    return ''; // actual program logic here 
} 
2

Попробуйте этот код. это определенно поможет вам.

<?php 
$text = "Hello {{var1}}, nice to meet {{var2}}"; 
$data = array("var1"=>"World","var2"=>"You"); 
foreach($data as $key => $value){ 
    $text = str_replace('{{'.$key.'}}', $value, $text); 
} 
echo $text; 
?> 
1
<?php 
    $data = array("var1" => "World", "var2" => "You"); 
    echo "Hello {$data['var1']}, nice to meet {$data['var2']}"; 
?> 

рефакторинга ...

-1

Быстрое решение может быть это один,

<?php 
function ReplaceWord($find,$replace,$srcstring) 
{ 
retrun str_replace($find,$replace,$srcstring); 
} 

echo ReplaceWord("WORLD","Peter","Hello world!"); 

?> 
Смежные вопросы