Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Замена "собственных" тегов по регулярному выражению в html.
Форумы портала PHP.SU » PHP » Программирование на PHP » Замена "собственных" тегов по регулярному выражению в html.

Страниц (1): [1]
 

1. MrSource - 12 Апреля, 2011 - 09:52:32 - перейти к сообщению
Здравствуйте, вот задался элементарной задачей, но что-то не могу сообразить как реализовать.

Допустим есть html страница:
CODE (html):
скопировать код в буфер обмена
  1. <html>
  2. ...
  3.  
  4. <body>
  5. <a href="./main/">[LANG:main]</a> <a href="./logout/">[LANG:logout]</a>
  6. </body>
  7.  
  8. </html>


Нужна функция, которая будет парсить этот html файл и все теги вида [LANG:*word*]
заменять на: $lang['*word*']
Например, на $lang['main']

P.S. составил регулярное выражение соответствующее задаче:
CODE (htmlphp):
скопировать код в буфер обмена
  1. (\\[)(LANG)(:)((?:[a-z][a-z0-9_]*))(\\])
2. dedyshka - 12 Апреля, 2011 - 10:42:21 - перейти к сообщению
есть функция preg_replace(), которая заменяет все вхождения шаблона в текст на определённую фразу, если тебе такое нужно...
3. Саныч - 12 Апреля, 2011 - 11:22:38 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. $html = ''; // тут ваш html
  2. $html = preg_replace('#\[LANG\:([a-z][a-z0-9_]*)\]#',$lang["$1"],$html);

p.s. не проверял, но должно работать
4. MrSource - 12 Апреля, 2011 - 12:00:01 - перейти к сообщению
Саныч пишет:
PHP:
скопировать код в буфер обмена
  1. $html = ''; // тут ваш html
  2. $html = preg_replace('#\[LANG\:([a-z][a-z0-9_]*)\]#',$lang["$1"],$html);

p.s. не проверял, но должно работать


Теги замещаются, но $lang["$1"] не может достучаться к массиву...
5. dedyshka - 12 Апреля, 2011 - 12:40:27 - перейти к сообщению
MrSource
может кавычки убрать?
6. OrmaJever - 12 Апреля, 2011 - 12:53:42 - перейти к сообщению
в php5.3 будет выглядеть так
PHP:
скопировать код в буфер обмена
  1. $html = preg_replace_callback('#\[LANG\:([a-z][a-z0-9_]*)\]#',function ($x) {return $lang[$x[1]];},$html);
7. MrSource - 12 Апреля, 2011 - 14:01:57 - перейти к сообщению
Не получается...
CODE (htmlphp):
скопировать код в буфер обмена
  1. Catchable fatal error: Object of class Closure could not be converted to string in *** on line *
8. OrmaJever - 12 Апреля, 2011 - 14:22:03 - перейти к сообщению
у вас php 5.3? если нет читайте create_function()
9. MrSource - 12 Апреля, 2011 - 14:23:31 - перейти к сообщению
PHP Version 5.3.1

Если код разложить так:
PHP:
скопировать код в буфер обмена
  1. $this -> content = preg_replace('#\[LANG\:([a-zA-Z0-9_]*)\]#',
  2. function ($x) {
  3.    return $lang['errors'][$x['1']];
  4. }
  5. ,$this->content);


то ошибка в последней строке, то есть $this->content
10. DeepVarvar - 12 Апреля, 2011 - 15:07:28 - перейти к сообщению
Вот вы все гоните...
PHP:
скопировать код в буфер обмена
  1. function parse($arr,$content) {
  2.     reset($arr);
  3.     while( list($name,$value) = each ($arr) ) {
  4.         if(!is_array($value)) {
  5.             $content = str_replace('['.strtoupper($name).']',$value,$content);
  6.             }
  7.         }
  8.      return $content;
  9.         }
  10. $str = "<b>[LANG]</b><br /><i>[FUCK]</i>";
  11. $array['lang'] = "английский";
  12. $array['fuck'] = "плохой язык";
  13. echo parse($array,$str);

Исходя из этого примера можно сделать обработчик и для вашего случая (с глубиной вложенности ключей).
11. MrSource - 13 Апреля, 2011 - 20:42:06 - перейти к сообщению
имеется функция:

PHP:
скопировать код в буфер обмена
  1. function word_replace() {
  2.         global $core;
  3.         $lang = registry::get('lang');
  4.         $this -> content = preg_replace('#\[LANG\:([a-zA-Z0-9_]*)\]#', $core -> get_lang('\\1'), $this->content);
  5. }


Как видно строка в шаблоне заменяется на результат функции $core -> get_lang() :

PHP:
скопировать код в буфер обмена
  1. function get_lang($word_id) {
  2.         if($this->set_lang == '1') {
  3.                 if(isset($lang['lang'][$word_id])) {
  4.                         return $lang['lang'][$word_id];
  5.                 }
  6.                 else return "[!LANG:".$word_id."]";
  7.         }
  8.         else {
  9.                 return false;
  10.         }
  11. }


Допустим, у нас имеется некий html.tpl(шаблон) с содержимым:

CODE (htmlphp):
скопировать код в буфер обмена
  1. <html>
  2. ...
  3. [LANG:hello]
  4. ...
  5. </html>


Исходя из выше указанного кода [LANG:hello] должен замениться на $lang['lang']['hello'], если таков элемент присутствует в массиве, если же нет, то на [!LANG:hello]


Что самое интересное, так это то, что $lang['lang'][$word_id] (функция get_lang 3 строка) не ссылается на массив, хотя имеет в себе слово hello, и echo $word_id выводит "hello", но как $lang['lang']['hello'] он не ссылается...

что за магия?

 

Powered by ExBB FM 1.0 RC1