2015-02-08 2 views
0

Извинения за плохой заголовок и объяснение.preg_replace() конкретный текст со значением из массива

Скажем, у меня есть массив как это:

$myArray = array(
    "name" => "Hello", 
    "description" => "World" 
); 

и некоторые HTML вроде этого:

<h1>{name}</h1> 
<p>{description}</p> 

Использование РНР preg_replace функции (или что-то еще, я не против), будет его можно заменить строки {} на значение в массиве?

<h1>Hello</h1> 
<p>World</p> 
+0

Да, можно с 'preg_replace_callback'. Я уверен, что какая-то доброта даст вам код за минуту. – georg

+0

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

+0

@will Предложенная функция автоматически _parse_ text? Без регулярных выражений? – mudasobwa

ответ

2

Вы можете сделать это в ванили PHP как это:

$str = '<h1>{name}</h1> 
<p>{description}</p>'; 

$myArray = array(
    "name" => "Hello", 
    "description" => "World" 
); 

echo preg_replace_callback('/\{(\w+)}/', function($match) use ($myArray){ 
    $matched = $match[0]; 
    $name = $match[1]; 
    return isset($myArray[$name]) ? $myArray[$name] : $matched; 
}, $str); 

И вот Resu lt:

<h1>Hello</h1> 
<p>World</p> 

Или вы можете использовать, например. ouzo-goodies который реализует StrSubstitutor

$str = '<h1>{{name}}</h1> 
<p>{{description}}</p>'; 

$myArray = array(
    "name" => "Hello", 
    "description" => "World" 
); 

$strSubstitutor = new StrSubstitutor($myArray); 
$substituted = $strSubstitutor->replace($str); 
+0

Этот маленький класс был всем, в чем я нуждался! Благодаря! – Zudo

0

Во-первых, давайте построим регулярное выражение:

$re = implode('|', array_map(function($el) { 
        return '{' . $el . '}'; 
        }, array_keys($myArray)); 

Теперь мы готовы к рок:

$result = preg_replace_callback(
    "/$re/", 
    function($match) use($myArray) { 
    return $myArray[$match[0]]; 
    } , $input 
); 
Смежные вопросы