Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Тексты > Передать callback-функции дополнительный параметр


Автор: 1234ru 6.8.2009, 09:25
Нужно при вызове preg_replace_callback() как-то смочь передать в callback-функцию дополнительный параметр (пусть $x), помимо массива совпадений, Причем $x должен после её работы возвращаться в уже измененном виде. 
Глобальной делать $x не годится, т.к. упомянутая preg_replace_callback() будет вызываться, в свою очередь, из функции, а не из глобальной области видимости.

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

Тут:
http://forum.vingrad.ru/forum/topic-268822/anchor-entry1936933/0.html
предлагают переделать в класс.

Это единственный способ?

Автор: IZ@TOP 8.8.2009, 12:29
Цитата(1234ru @  6.8.2009,  10:25 Найти цитируемый пост)
Тут:
http://forum.vingrad.ru/forum/topic-268822...y1936933/0.html
предлагают переделать в класс.

Это единственный способ?

Я хотел тоже самое предложить. Но, помимо этого, можно переменную подставить в параметре замены
Код

$text = preg_replace("/([a-z]+)/e", "function('\\1', '".$x."')", $text);

Например.

Автор: 1234ru 26.8.2009, 02:44
Цитата
Я хотел тоже самое предложить. Но, помимо этого, можно переменную подставить в параметре замены


По-моему, чтобы так можно было делать, имя переменной должно встречаться в обрабатываемом тексте. Откуда оно там появится - как-то непонятно.

(хотя, может, я туплю)

Автор: IZ@TOP 26.8.2009, 11:46
1234ru, я же привел пример. А что значит "имя переменной должно встречаться в обрабатываемом тексте"? Откуда в тексте вообще переменные?

Автор: 1234ru 27.8.2009, 13:02
Извиняюсь, чё-то я затупил...

Да, действительно так можно. Только надо, чтобы $x была в одинарных кавычках, а не в двойных: 
Код
'function($1, $x)'
, иначе вместо её самой будет подставлено её содержимое, и изменить её в функции уже никак будет нельзя. 

Но у такого подхода есть два недостатка:

1. через модификатор 'e' оказывается медленнее в 3-6 раз, чем через callback-функцию (если надо, могу выложить код, которым тестировал) 

2. если в фукнции придется задействовать совпадения дополнительных подмасок (а не только, например, целого текста), то у неё придется менять число аргументов

Автор: NewDima 31.8.2009, 18:44
А кто сказал делать глобальной? Сделай ее статичной в функции

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