Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Замена определенных слов в документе


Автор: Aliance 22.5.2005, 20:45
Как заменить в документе определенные слова, заключенные между %...% на их определенные заменители. Оба значения берутся из массива. Читал на php.net про ereg(i), ereg(i)_replace и т.п. но не помогло, т.к. третий параметр весь документ. Соотв. нужно инклюдить его... в общем заморочка, не хочу. Есть другой способ?

По человечески. Имеем документ index.php:
Код

<HTML>
<BODY>

jhjhj
%TABLE%
hjhgjhg
%SMTH_ELSE% 

</BODY>
</HTML>


Как заменить %TABLE% на <hr>, а %SMTH_ELSE% на <br>, скажем. При чем, должен учитываться регистр. Желательно...

Автор: Mal Hack 22.5.2005, 20:49
str_replace( "#%TABLE%#" , "<hr>" , $txt );
Но это для данного конкретного случая. Для пармера шаблонов надо делать preg_replace с callback функцией.

Автор: Aliance 22.5.2005, 21:16
Цитата(Mal @ 22.5.2005, 21:49)
str_replace( "#%TABLE%#" , "<hr>" , $txt );

Я же написал, что это не подходит... Я не хочу извратами получать $txt...

Цитата(Mal @ 22.5.2005, 21:49)
Для пармера шаблонов надо делать preg_replace с callback функцией

smile

Автор: Mal Hack 22.5.2005, 21:21
http://forum.vingrad.ru/index.php?showtopic=45358&st=0&unread=#entry356239
Вот тут мне объясняли. Последние файлы с таким подходом.

Автор: Aliance 22.5.2005, 22:26
Не нашел... smile
Там вообще ж дело о подсветке :-)

Автор: Mal Hack 22.5.2005, 23:00
Цитата(Aliance @ 22.5.2005, 23:26)
Там вообще ж дело о подсветке :-)

Дело в подходе.
Код
return preg_replace( "#%(.+?)%#ie" , "hl_do( '\\1' )" , $code , TRUE );

function hl_do( $text )
 {
  switch( $text )
   {
     case "TITLE": return "это заголовок" break;
     case "TITLE1": return "это заголовок 1" break;
     case "TITLE2": return "это заголовок2" break;
     default: return "неверное имя шаблона";
   }
 }


Автор: Aliance 22.5.2005, 23:04
При чем тут это непонимаю.
Мне нужно в странице написать %test% и при выходе получить HTML вместо %test% - <b>bla-bla-bla</b>

Автор: Mal Hack 22.5.2005, 23:11
Код
<?php

$code = "adhakdjdhsa %test% dh";
print preg_replace( "#%(.+?)%#ie" , "hl_do( '\\1' )" , $code , TRUE );

function hl_do( $text )
 {
  switch( $text )
   {
     case "test": return "<b>bla-bla-bla</b>"; break;
   }
 }

?>

Автор: Aliance 22.5.2005, 23:38
Mal Hack
smile ррр
Как в строке я знаю!
Я не знаю как во всем документе!
Можно канечно сделать файл index2.php с этой разметкой, а потом в index.php написать такое:
Код

include("index2.php");
$a = file("index2.php");
str_replace( "#%TABLE%#" , "<hr>" , $a );

Но я так не хочу! Я спрашиваю можно именно в самом документе получить ссылку на само себя...?

Автор: Mal Hack 22.5.2005, 23:42
Цитата(Aliance @ 23.5.2005, 00:38)
Я не знаю как во всем документе!

А чем весь документ от строки не отличается? smile

Цитата(Aliance @ 23.5.2005, 00:38)
Я спрашиваю можно именно в самом документе получить ссылку на само себя...?

А это как понимать? smile

Автор: Aliance 22.5.2005, 23:51
Цитата(Mal @ 23.5.2005, 00:42)
А чем весь документ от строки не отличается?

Не знаю smile Вот и я хочу узнать, но для этого нужен пример с документом, а не со строкой.

Цитата(Mal @ 23.5.2005, 00:42)
А это как понимать?

Млин. Незнаю как объяснить еще:
Есть файл index.php, там пишем:
Код

привет, это я, сегодня %time% часов!


А браузер должен получить такой код в этой же страничке:
Код

привет, это я, сегодня <b>69</b> часов!

Автор: Mal Hack 22.5.2005, 23:57
Код
<?php
$code = file_get_contents( "file.txt" );
print preg_replace( "#%(.+?)%#ie" , "hl_do( '\\1' )" , $code , TRUE );
function hl_do( $text )
 {
  switch( $text )
   {
     case "test": return "<b>bla-bla-bla</b>"; break;
   }
 }
?>

При этом текстоый файлл не имеет отношения к PHP.

Автор: Aliance 23.5.2005, 00:03
нет, опять не-то. Я же написал
Цитата(Aliance @ 23.5.2005, 00:51)
получить такой код в этой же страничке:

Т.е. $code должна ссылатся на тот документ, где она написана // грубо говоря

*окончательно обессилив, ушел спать*

Автор: Mont 23.5.2005, 04:37
с трудом но вроде понял... smile
так если у тебя в этом же файле написано:
Код

привет, это я, сегодня %time% часов!


значит тебе просто надо это дело писать не ввиде HTML, а в ПХП выводить через echo, или print. Ну а там соответственно подставляй какие хочешь значения.

но это конечно если я тебя правильно понял smile

Автор: IZ@TOP 23.5.2005, 08:13
Я понял что ты хочешь. Нужно заменить текст в вызываемом РHTML документе?
Тогда извращаемся след. образом:

Код

<?php
ob_start();
?>
<html>
...
<body>
bla-bla %text% ... la-la-la..
</body>
</html>
<?php
$buff = ob_get_clean();
str_replace('%text%', 'bla-bla2', $buff);
?>


Но это ИМХО уже изврат полный. Выноси содержимое в отдельный файл. К примеру index.tpl, потом читай, потом заменяй, и выводи.

Автор: Aliance 23.5.2005, 08:21
Цитата(Mont @ 23.5.2005, 05:37)
значит тебе просто надо это дело писать не ввиде HTML, а в ПХП выводить через echo, или print. Ну а там соответственно подставляй какие хочешь значения.

Нет, я же написал файл называется index.php - т.е. там сочитаются HTML и PHP!

IZ@TOP
Да, получается изврат.

Ладно, скажу проще. В IPB есть такие вещи в PHP файле:
Код

...
{BLA-BLA-BLA}
...

И это заменяется на то-то и то-то... Макросы другим словом.

Автор: Mal Hack 23.5.2005, 09:48
Цитата(Aliance @ 23.5.2005, 09:21)
Ладно, скажу проще. В IPB есть такие вещи в PHP файле:

Это по тому принципу, который я тебе показал.

Автор: Opik 23.5.2005, 10:27
Aliance
сами макросы в IPB хранятся в базе.

Код

        $TAGS = $DB->query("SELECT macro_value, macro_replace FROM ibf_macro WHERE macro_set={$ibforums->skin['macro_id']}");
              while ( $row = $DB->fetch_row($TAGS) )
              {
                        if ($row['macro_value'] != "")
                        {
                                $ibforums->skin['template'] = str_replace( "<{".$row['macro_value']."}>", $row['macro_replace'], $ibforums->skin['template'] );
                        }
                }

Автор: Aliance 23.5.2005, 15:31
Opr
Это мне ничего не дает... Тут принцип нужен :-)

Mal Hack
значит мне не дано понять это =)

Автор: Opik 23.5.2005, 16:43
Aliance
я лишнее и так убрал и оставил 1 принцип.
в базе хранится
что меняется | на что меняется.
Код

 while ( $row = $DB->fetch_row($TAGS) )
              {
                        if ($row['macro_value'] != "")
                        {
                                $ibforums->skin['template'] = str_replace( "<{".$row['macro_value']."}>", $row['macro_replace'], $ibforums->skin['template'] );
                        }
                }

- производим замену.
в чем проблема?

Автор: Mal Hack 23.5.2005, 18:43
Цитата(Aliance @ 23.5.2005, 16:31)
значит мне не дано понять это =)

Есть текст. В нем макросы (%test%).
Мы идем по тексту. Находим макрос. Передаем в функцию, которая возвращает значение, на которое мы заменяем этот макрос.
Сама функция смотрит, какой именно макрос пришел и исходя из этого возвращает текст. Уж как проще, прости не могу smile

Автор: Aliance 23.5.2005, 20:41
Дело в том, Mal Hack, что в твоем примере текст из IPB берется из темпалта файла *.tpl - тоесть вместо 1 файла (index.php) их 2 (index.php, template.tpl). А я с самого начал поставил условие - файл один.

Автор: Mal Hack 23.5.2005, 20:43
Цитата(Aliance @ 23.5.2005, 21:41)
Дело в том, Mal Hack, что в твоем примере текст из IPB берется из темпалта файла *.tpl - тоесть вместо 1 файла (index.php) их 2 (index.php, template.tpl). А я с самого начал поставил условие - файл один.

Дык какая разница откуда берется... Главное что ты с ним потом делаешь!! smile

Автор: Aliance 23.5.2005, 20:45
В сотый раз повторяю: я не знаю как взять в переменную ссылку на сам документ, чтобы из него вырезать то, что мне нужно.

Автор: Mal Hack 23.5.2005, 20:48
Код

<?php
ob_start();
?>

<html>
...
<body>
bla-bla %text% ... la-la-la..
</body>
</html>

<?php
$code = ob_get_clean();
print preg_replace( "#%(.+?)%#ie" , "hl_do( '\\1' )" , $code , TRUE );
function hl_do( $text )
 {
  switch( $text )
   {
     case "test": return "<b>bla-bla-bla</b>"; break;
   }
 }

?>

Автор: Aliance 23.5.2005, 21:43
Не работает

Автор: Mal Hack 23.5.2005, 21:44
Код
<?php
ob_start();
?>
<html>
...
<body>
bla-bla %test% ... la-la-la..
</body>
</html>
<?php
$code = ob_get_clean();
print preg_replace( "#%(.+?)%#ie" , "hl_do( '\\1' )" , $code , TRUE );
function hl_do( $text )
 {
  switch( $text )
   {
     case "test": return "<b>bla-bla-bla</b>"; break;
   }
 }
?>

Автор: Aliance 23.5.2005, 21:50
Mal Hack
А есть отличия?

Автор: Mal Hack 23.5.2005, 22:45
Цитата(Aliance @ 23.5.2005, 22:50)
А есть отличия?


Цитата(Mal @ 23.5.2005, 21:48)
bla-bla %text% ... la-la-la..


Цитата(Mal @ 23.5.2005, 22:44)
bla-bla %test% ... la-la-la..

smile

Автор: Aliance 23.5.2005, 23:10
Пасип, работает. Но больно муторно как-то...подумаю, использовать ли ))
С меня плюс

Автор: Mal Hack 23.5.2005, 23:25
Цитата(Aliance @ 24.5.2005, 00:10)
Но больно муторно как-то...подумаю, использовать ли ))

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)