Перейти к содержимому


Партнерская программа Kredov

  • Закрытая тема Тема закрыта

Парсинг строки: Как использовать вместо строки-шаблона функцию

#1 Дилетант

Дилетант
  • Пользователь
  • 53 сообщений
  • Репутация: 0
0

Отправлено 12 Июль 2010 - 17:45

Уважаемые, нужна помощь.
Есть такая конструкция:

[date]http://mysite.ru/dir/images/img.gif[/date]

нужно, чтобы вместо этой конструкции выводилась дата файла в виде 01/10/2010

Я вот пытался что-то сам кумекать,

$text = preg_replace("/\[date\](\S+?\\S+?)\[\/date\]/is",'.date("D, d M Y H:i:s T", filemtime("$1")).',$text);


не получается. Выводит текстовую строку.

 

 

  • 0

#2 Евгений

Евгений
  • Пользователь
  • 481 сообщений
  • Репутация: 0

Отправлено 12 Июль 2010 - 19:31

$str = '[date]1.jpg[/date]';
$text = preg_replace("#\[date\](.+)\[\/date\]#i", "\\1", $str);
echo date("D, d M Y H:i:s T", filemtime($text));


в следующий раз создавай отдельную тему
  • 0

#3 Дилетант

Дилетант
    Topic Starter
  • Пользователь
  • 53 сообщений
  • Репутация: 0

Отправлено 13 Июль 2010 - 07:26

Спасибо огромное. Буду пробовать.

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

"Школьник" я еще. Нет 10 сообщений. А где тогда вопрос задавать? Вот и выбрал более-менее подходящую тему.


  • 0

#4 Дилетант

Дилетант
    Topic Starter
  • Пользователь
  • 53 сообщений
  • Репутация: 0

Отправлено 13 Июль 2010 - 11:51

А по аналогии с конструкцией
[email=null@mail.ru]null@mail.ru[/email]
которая обрабатывается одной строкой
$text = preg_replace("/\[email\](\S+?\@\S+?)\[\/email\]/is","<a href=\"mailto:$1\">$1</a>",$text);

как сделать для конструкции [date]1.jpg[/date]
Что-то у меня не получилось предыдущий код в одну строку составить.
  • 0

#5 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 13 Июль 2010 - 15:16

Дилетант, вот наберете 10 сообщений и создадите тему, а данную тему я выделю в отдельное производство :)

В одну строку у вас сделать не получится, так как вторым параметром функции preg_replace является строка шаблона-замены. Вы не можете использовать вместо строки вызов функции.
Вы можете использовать другую функцию: preg_replace_callback()
В ней исполняется код функции обратного вызова. Вы можете вместо функции обратного вызова создать функцию на лету с помощью: create_function()

P.s.: Что-то я не пойму, а чем вам не нравится код в 3 строчки? Или вы считаете, что длинная непонятная строка это хороший тон?


  • 0

#6 Дилетант

Дилетант
    Topic Starter
  • Пользователь
  • 53 сообщений
  • Репутация: 0

Отправлено 13 Июль 2010 - 18:33

ZiTosS, код из 3-х строчек мне нравится. И претензий к нему нет. Дело в том, что мне это хозяйство нужно впихнуть в код "движка", который у меня уже работает. Если бы писалось что-то новое, проблем нет.
ZiTosS, как одной строкой все это дело оформить? Можно ли? Напиши, пожалуйста?
  • 0

#7 yury

yury
  • Пользователь
  • 629 сообщений
  • Репутация: 176

Отправлено 14 Июль 2010 - 11:08

Дилетант, У вас эта конструкция работает? Странно.
Она годится для

[email]null@mail.ru[/email]
но никак не для
[email=null@mail.ru]null@mail.ru[/email]
Относительно того, что вам сильно хочется весь код (про дату файла) загнать в одну строку:
$text = date("d/m/Y", filemtime(preg_replace("/\[date\](\S+?)\[\/date\]/is", "$1", $text)));

  • 0

#8 Дилетант

Дилетант
    Topic Starter
  • Пользователь
  • 53 сообщений
  • Репутация: 0

Отправлено 14 Июль 2010 - 11:32

yury, конечно же конструкция
[email]null@mail.ru[/email]
я неверно указал.

Дело в том, что у меня в движке обработчик boardcode(&$text,$html=0,$tid,$pid)

просматривает $text поста и меняет там бордкоды.

пример:

$text = preg_replace("/\[font=([\w ]+?)\]/is","<font face=\"$1\">",$text);
$text = preg_replace("/\[color=([#\w\d]+?)\]/is","<font color=\"$1\">",$text);
$text = preg_replace("/\[size=(\d+?)\]/is","<font size=\"$1\">",$text);
$text = preg_replace("/\[off\](.*?)\[\/off\]/is","<div class=\"offtopic\">".MSG_offtopic.": $1</div>",$text);

и т.д.


Поэтому не знаю как это сделать одной строкой для бордкода DATE. :angry:
  • 0

#9 yury

yury
  • Пользователь
  • 629 сообщений
  • Репутация: 176

Отправлено 14 Июль 2010 - 11:42

...
Поэтому не знаю как это сделать одной строкой. :angry:

Дилетант,
я ж вам вроде дал готовый однострочный код:
$text = date("d/m/Y", filemtime(preg_replace("/\[date\](\S+?)\[\/date\]/is", "$1", $text)));

который будет выдавать дату файла, закодированную конструкцией типа [date]http://mysite.ru/dir/images/img.gif[/date]

Или я не понял и вы что-то другое не знаете?
  • 0

#10 Дилетант

Дилетант
    Topic Starter
  • Пользователь
  • 53 сообщений
  • Репутация: 0

Отправлено 14 Июль 2010 - 11:51

Вставил код
$text = date("d/m/Y", filemtime(preg_replace("/\[date\](\S+?)\[\/date\]/is", "$1", $text)));

в код движка форума функцию boardcode(&$text,$html=0,$tid,$pid) последней строкой.

вместо текста сообщения поста выдается дата - 01/01/1970.

Весь $text, который был уже модифицирован заменен на дату 01/01/1970
  • 0

robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85


Оформление форума – IPBSkins.ru