Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Замена в тексте элементами массива
 
 автор: Axxil   (31.07.2008 в 13:36)   письмо автору
 
 

Дано:
<?$data = array('key1'=>'value1','key2'=>'value2');
$text 'This is text whith {key1} and {key2} and  undefined {key3}';?>


Нужно заменить подстановки в тексте на сооветствующие значения массива. А если такого ключа в массиве нет, то {...} удаляется.

Можно это как-то без цикла сделать?

  Ответить  
 
 автор: Trianon   (31.07.2008 в 13:45)   письмо автору
 
   для: 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);
?>


Правда нужно обеспечить более жесткий лексический контроль за ключами массива

  Ответить  
 
 автор: Axxil   (31.07.2008 в 13:58)   письмо автору
 
   для: 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

  Ответить  
 
 автор: Trianon   (31.07.2008 в 14:08)   письмо автору
 
   для: Axxil   (31.07.2008 в 13:58)
 

>Круто. Спасибо.
>А по скорости не быстрее будет сначала вытащить все элементы, а потом заменить обычными строковыми функциями, которые, говорят, гораздо быстрее регулярных выражений?

Можете померять быстродействие. Сомневаюсь, что Вы достигните значительного выигрыша,
вероятно, даже проиграете.

>Может я зря озадачился "безцикленностью" ?

Я бы озадачился безопасностью.
При таком подходе очень легко насовать XSS ...

  Ответить  
 
 автор: Axxil   (31.07.2008 в 14:10)   письмо автору
 
   для: Trianon   (31.07.2008 в 14:08)
 

> При таком подходе очень легко насовать XSS ...
Можно пример? А то я в этой теме слабо пока разбираюсь.

  Ответить  
 
 автор: BinLaden   (31.07.2008 в 18:29)   письмо автору
 
   для: Axxil   (31.07.2008 в 14:10)
 

> preg_match_all('/{([\w\d]+)}/e',$text,$out);

Модификатор тут лишний.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования