|
|
|
| Дано:
<?$data = array('key1'=>'value1','key2'=>'value2');
$text = 'This is text whith {key1} and {key2} and undefined {key3}';?>
|
Нужно заменить подстановки в тексте на сооветствующие значения массива. А если такого ключа в массиве нет, то {...} удаляется.
Можно это как-то без цикла сделать? | |
|
|
|
|
|
|
|
для: Axxil
(31.07.2008 в 13:36)
| | придется создавать ссылку на массив в глобальной области видимости.
<?php
function helper($res)
{
$s = $GLOBALS['helper_chunk'];
return isset($s[$res[1]])? $s[$res[1]] : '';
}
$data = array('key1'=>'value1','key2'=>'value2');
$text = 'This is text whith {key1} and {key2} and undefined {key3}';
$GLOBALS['helper_chunk'] = &$data;
echo preg_replace_callback('/{([\w\d]+)}/', 'helper', $text);
?>
|
Впрочем, нет... не придется.
<?php
$data = array('key1'=>'value1','key2'=>'value2');
$text = 'This is text whith {key1} and {key2} and undefined {key3}';
echo preg_replace('/{([\w\d]+)}/e', '@$data["\\1"]', $text);
?>
|
Правда нужно обеспечить более жесткий лексический контроль за ключами массива | |
|
|
|
|
|
|
|
для: Trianon
(31.07.2008 в 13:45)
| | Круто. Спасибо.
А по скорости не быстрее будет сначала вытащить все элементы, а потом заменить обычными строковыми функциями, которые, говорят, гораздо быстрее регулярных выражений?
<?
preg_match_all('/{([\w\d]+)}/e',$text,$out);
foreach($out[1] as $i=>$key){
$text = str_replace($out[0][$i],$data[$key],$text);
}
echo $text;
?>
|
Может я зря озадачился "безцикленностью" ?
UPD: Хм... не ожидал. Первый тест - вариант без цикла. Второй - вариант с циклом. Примерно в 4 раза выигрыш получается при использовании цикла. Но это на очень маленьких объёмах (2 элемента). Надо будет дальше потестировать на больших объёмах.
This is text whith value1 and value2 and undefined
Time: 0.000484943389893
--------------------------------------------------------------------------------
This is text whith value1 and value2 and undefined
Time: 0.000104904174805
|
| |
|
|
|
|
|
|
|
для: Axxil
(31.07.2008 в 13:58)
| | >Круто. Спасибо.
>А по скорости не быстрее будет сначала вытащить все элементы, а потом заменить обычными строковыми функциями, которые, говорят, гораздо быстрее регулярных выражений?
Можете померять быстродействие. Сомневаюсь, что Вы достигните значительного выигрыша,
вероятно, даже проиграете.
>Может я зря озадачился "безцикленностью" ?
Я бы озадачился безопасностью.
При таком подходе очень легко насовать XSS ... | |
|
|
|
|
|
|
|
для: Trianon
(31.07.2008 в 14:08)
| | > При таком подходе очень легко насовать XSS ...
Можно пример? А то я в этой теме слабо пока разбираюсь. | |
|
|
|
|
|
|
|
для: Axxil
(31.07.2008 в 14:10)
| | > preg_match_all('/{([\w\d]+)}/e',$text,$out);
Модификатор тут лишний. | |
|
|
|