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

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

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
MrSource
Отправлено: 12 Апреля, 2011 - 09:52:32
Post Id



Гость


Покинул форум
Сообщений всего: 77
Дата рег-ции: Янв. 2010  
Откуда: Украина, Донецк


Помог: 0 раз(а)




Здравствуйте, вот задался элементарной задачей, но что-то не могу сообразить как реализовать.

Допустим есть 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_]*))(\\])

(Отредактировано автором: 12 Апреля, 2011 - 10:09:06)

 
 Top
dedyshka
Отправлено: 12 Апреля, 2011 - 10:42:21
Post Id


Новичок


Покинул форум
Сообщений всего: 31
Дата рег-ции: Янв. 2011  


Помог: 1 раз(а)




есть функция preg_replace(), которая заменяет все вхождения шаблона в текст на определённую фразу, если тебе такое нужно...
 
 Top
Саныч Модератор
Отправлено: 12 Апреля, 2011 - 11:22:38
Post Id



Участник


Покинул форум
Сообщений всего: 1365
Дата рег-ции: Июль 2010  
Откуда: Украина, Запорожье


Помог: 62 раз(а)




PHP:
скопировать код в буфер обмена
  1. $html = ''; // тут ваш html
  2. $html = preg_replace('#\[LANG\:([a-z][a-z0-9_]*)\]#',$lang["$1"],$html);

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


-----
Все возражают против того, что я гений, хотя никто еще так меня не назвал. - Орсон Уэллс
 
 Top
MrSource
Отправлено: 12 Апреля, 2011 - 12:00:01
Post Id



Гость


Покинул форум
Сообщений всего: 77
Дата рег-ции: Янв. 2010  
Откуда: Украина, Донецк


Помог: 0 раз(а)




Саныч пишет:
PHP:
скопировать код в буфер обмена
  1. $html = ''; // тут ваш html
  2. $html = preg_replace('#\[LANG\:([a-z][a-z0-9_]*)\]#',$lang["$1"],$html);

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


Теги замещаются, но $lang["$1"] не может достучаться к массиву...
 
 Top
dedyshka
Отправлено: 12 Апреля, 2011 - 12:40:27
Post Id


Новичок


Покинул форум
Сообщений всего: 31
Дата рег-ции: Янв. 2011  


Помог: 1 раз(а)




MrSource
может кавычки убрать?
 
 Top
OrmaJever Модератор
Отправлено: 12 Апреля, 2011 - 12:53:42
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




в php5.3 будет выглядеть так
PHP:
скопировать код в буфер обмена
  1. $html = preg_replace_callback('#\[LANG\:([a-z][a-z0-9_]*)\]#',function ($x) {return $lang[$x[1]];},$html);


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
MrSource
Отправлено: 12 Апреля, 2011 - 14:01:57
Post Id



Гость


Покинул форум
Сообщений всего: 77
Дата рег-ции: Янв. 2010  
Откуда: Украина, Донецк


Помог: 0 раз(а)




Не получается...
CODE (htmlphp):
скопировать код в буфер обмена
  1. Catchable fatal error: Object of class Closure could not be converted to string in *** on line *

(Отредактировано автором: 12 Апреля, 2011 - 14:02:14)

 
 Top
OrmaJever Модератор
Отправлено: 12 Апреля, 2011 - 14:22:03
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




у вас php 5.3? если нет читайте create_function()


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
MrSource
Отправлено: 12 Апреля, 2011 - 14:23:31
Post Id



Гость


Покинул форум
Сообщений всего: 77
Дата рег-ции: Янв. 2010  
Откуда: Украина, Донецк


Помог: 0 раз(а)




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

(Отредактировано автором: 12 Апреля, 2011 - 14:35:43)

 
 Top
DeepVarvar Супермодератор
Отправлено: 12 Апреля, 2011 - 15:07:28
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Вот вы все гоните...
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);

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



Гость


Покинул форум
Сообщений всего: 77
Дата рег-ции: Янв. 2010  
Откуда: Украина, Донецк


Помог: 0 раз(а)




имеется функция:

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'] он не ссылается...

что за магия?
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB