Доступ к глобальному состоянию в PHP с помощью обратных вызовов preg_replace_callback () - PullRequest
0 голосов
/ 02 ноября 2011

У меня есть фрагмент текста, например:

XYZ id dui vel erat bibendum hendrerit aliquet ac lorem.Integer ABC turpis, facilisis sit amet ultricies non, tempor LMNOP est. Aliquam sit amet sapien justo.Quisque TUV dolor dolor, eu sodales mi.

Мне нужно заменить жирные слова на пронумерованные заполнители.

%%% 1 %%% id dui vel erat bibendum hendrerit aliquet ac lorem.Целое число %%% 2 %%% turpis, facilisis sit amet ultricies non, tempor %%% 3 %%% est. Aliquam sit amet sapien justo.Quisque %%% 4 %%% dolor dolor, eu sodales mi.

При выполнении этой замены мне нужно сохранить в массив текст, который он заменяет (например, XYZ), и ввести номерзаполнитель (например, 1), так что я могу вернуться и заменить их исходными значениями позже.

Сложная часть в том, что я не знаю текст замены заранее, поэтому мне нужнообратный вызов для его генерации на основе текущего количества уже замененных элементов.

Я работаю на более старой версии PHP и в моем наборе инструментов нет анонимных функций, поэтому я считаю, что я ограниченобратные вызовы с использованием preg_replace_callback.Кажется, моя проблема сводится к тому, что мне нужны создаваемые мной функции (используя create_function), чтобы иметь возможность доступа к некоторому общему глобальному состоянию - по крайней мере, к общему глобальному массиву, где я могунажмите и вытолкните текст, который был заменен на стек.

Возможно ли это?

Ответы [ 3 ]

1 голос
/ 02 ноября 2011

Вы всегда можете передать метод класса и использовать свойства экземпляров (просто посмотрите на тип обратного вызова ).Ключевое слово global также возможно, если оно лучше соответствует вашей ситуации.

1 голос
/ 02 ноября 2011

Вместо использования create_function() вам будет проще выполнять обычные функции. (Просто проще не иметь дело со сложной выходящей строкой, необходимой.)

Используйте global $var; для установки глобального.

Затем после запуска вашего доступа замените этот глобальный доступ (если вызов замены находится в функции, вам нужно будет также сказать global $var;).

0 голосов
/ 02 ноября 2011

Если вы используете PHP 5.3, вы можете создать замыкание и импортировать данные локальной области в обратном вызове.Это позволяет избежать беспорядка глобальных данных, позволяя вашим обратным вызовам получать доступ к нужным данным.Ниже приведен тривиальный пример

<?php
// The data you want to use in your function
$data = array(/* ... whatever ... */);

$val = preg_replace_callback('/regex/', function ($matches) use ($data) {
    /* do stuff here with $data and $matches */
});
?>
...