Чтение RSS каналов

Форум

Открыть Ответить

Новые функции CMS и их производительность относительно версий PHP

21
13.01.2018 11:16:0913.01.2018 11:16:55
И еще один момент. добавь в тест вот это:
$txt = "hi all, I said hello";
// test strtr
$trans = array("h" => "-", "hello" => "hi", "hi" => "hello", "saider" => "babah");
echo "strtr: ".strtr($txt, $trans)."<br>";
// test str_replace
$trans_in = array("h", "hello", "hi", "saider");
$trans_out = array("-", "hi", "hello", "babah");
echo "str_replace: ".str_replace($trans_in, $trans_out, $txt)."<br>";


Обратите внимание на приоритет замен в strtr ("h" не используется, так как существуют более длинные совпадения) и как замененный текст больше не участвует в поиске. А вот str_replace делает замену по очереди в соответствии с ключем массивов.

Оно тебе надо? ))

Здесь молодость бродит крылато, и старость не клонит голов.
3.4

3.4
22
13.01.2018 11:26:02
А вот еще очень интересный пример, где str_replace заменяет все до посинения ))
http://php.net/manual/ru/function.strtr.php#117169
Т.е. эта функция производит замену многократно (замену в замене при обнаружении совпадения даже после замены), когда strtr делает замену только один раз и больше к этой строке не возвращается.

$strTemplate = "My name is :name, not :name2.";
$strParams = [
  ':name' => 'Dave',
  'Dave' => ':name2 or :password', // a wrench in the otherwise sensible input
  ':name2' => 'Steve',
  ':pass' => '7hf2348', // sensitive data that maybe shouldn't be here
];

echo strtr($strTemplate, $strParams);
// "My name is Dave, not Steve."

echo str_replace(array_keys($strParams), array_values($strParams), $strTemplate);
// "My name is Steve or 7hf2348word, not Steve or 7hf2348word2."

Здесь молодость бродит крылато, и старость не клонит голов.
3.4

3.4
23
13.01.2018 14:48:56
В будущем планирую создать отдел, по типу как это реализовано на php.net, с детальным описанием функций CMS и примеров их применения. Так же будет предложена возможность комментирования и обсуждения. Думаю что подобный функционал будет полезен как для начинающих, так и для опытных веб разработчиков.

О сколько нам открытий чудных,
Готовит просвещенья дух,
И опыт, сын ошибок трудных,
И гений, парадоксов друг...
3.21

3.21
24
16.01.2018 11:16:31
Под итог лучше и привычнее использовать str_replace.

Только надо попробовать в переменной в выводимом тексте добавить имена переменных как в шаблоне. Заменит он их или нет? по идее должен. А значит, надо их htmlspecialchar`ом выводить...

Здесь молодость бродит крылато, и старость не клонит голов.
3.4

3.4
25
16.01.2018 17:35:5316.01.2018 20:57:12

Под итог лучше и привычнее использовать str_replace

Функция str_replace используется в системе изначально, с тех времён когда ещё многие другие CMS активно юзали ereg_replace Смайл - 13

Предполагал что strtr будет работать быстрее, потому как на основании документации PHP, она именно для этих целей и создана, работает с двумя аргументами массива типа: array('{%login%}' => $cont, '{%theme%}' => $theme); без каких либо манипуляций.

В отличии от функции: str_replace, в которой потребуется определить ключи array_keys($value) и их значения array_values($value). Что самое интересное, даже в этом варианте: str_replace(array_keys($value), array_values($value), $sub) по результатам сравнительного тестирования, данный метод оказывается быстрее.

Только надо попробовать в переменной в выводимом тексте добавить имена переменных как в шаблоне. Заменит он их или нет?

На проекте уже как несколько недель используется этот метод Смайл - 13 На данный момент лучшей альтернативы ещё не придумали.

А значит, надо их htmlspecialchar`ом выводить...

Непонятен смысл использования. Поломать все HTML шаблоны?

Предлагаю на обозрение, одна из новых функций шаблонизатора с внутренним кешированием. Принимает массив с переменными для замены из вне функции, так же возможно добавление внутри метода.
function setTemplateBasic($tpl, $val = '') {
	global $theme, $conf;
	static $argc, $cach, $cont;
	if ($argc != $tpl || !isset($cach)) {
		$argc = $tpl;
		$cont = getThemeFile($argc);
		if ($cont) $cach = file_get_contents($cont);
	}
	if ($cont) {
		$value = array('{%theme%}' => $theme);
		$value = is_array($val) ? array_merge($value, $val) : $value;
		return str_replace(array_keys($value), array_values($value), $cach);
	} else {
		return setTemplateWarning('warn', array('time' => '', 'url' => '', 'id' => 'warn', 'text' => sprintf(_ERRORTPL, $tpl)));
	}
}

О сколько нам открытий чудных,
Готовит просвещенья дух,
И опыт, сын ошибок трудных,
И гений, парадоксов друг...
3.21

3.21
26
16.01.2018 22:19:2718.01.2018 07:04:14
Не, шаблоны тут не при чем. именно то, что будет выводиться вместо {%var%} выводить через htmlspecialchar - что бы после замены еще раз уже в выводимом значении {%var%} не поменялась на тоже выводимое значение. Хотя тут бесконечный цикл получается какой то. Или, как я понял из примера выше, это работает, если есть похожий следующий ключ. (это в прмере про :name и Dave)


Сервер: Сервер в интернете

Здесь молодость бродит крылато, и старость не клонит голов.
3.4

3.4
27
17.01.2018 17:45:5717.01.2018 17:54:02

как я понял из примера выше, это работает, если есть похожий следующий ключ. (это в прмере про :name и Save)

Приведённый тобой пример выше в учёт брать не стоит. В нашем случае логика совсем другая и продумана изначально, поэтому пересечений или конфликтов в стандарте быть не может.

Причиной тому уникальные переменные, так называемые "мини шаблоны" типа: {%theme%}. В нашем случае это ключ, который, как правило, в массиве указан только один раз. Именно для этих целей, для создания уникальности в них используются нестандартные символы, не применяемые в такой последовательности, в стандарте HTML5, а именно открывающая {% и закрывающая %}.

Если бы мы использовали стандартные названия, то в этом случае были бы возможны конфликты и двойная перезапись значений.

О сколько нам открытий чудных,
Готовит просвещенья дух,
И опыт, сын ошибок трудных,
И гений, парадоксов друг...
3.21

3.21
Открыть Ответить

Ключевые слова

036cont039arg092argccachgetfunctionwarnthemefunctpllanфункции
Хотите опробовать SLAED CMS в действии?

Технологии

PHP MySQL HTML 5 CSS 3 jQuery jQuery UI

Контакты

  • D-49179, Deutschland
    Ostercappeln, Im Siek 6
  • +49 176 61966679

  • slaed.net
Идеи и предложения
Обратная связь