Нетривиальная задача на php

12
Анабой Янсур
На сайте с 12.04.2011
Offline
114
1005

Интересует возможность реализации такого сценария на php.

В скрипте ссылки выводятся по типу

echo sefUrl('здесь_ссылка');

Задача: можно ли сначала получить все ссылки которые передаются через функцию.

С данным массивом будет производится какая-то манипуляция, и обратно передать результат на тот же самый вызов функции.

А то парсить сгенерированный документ и отлавливать в нем ссылки меня не очень прельщает.

bon_eur
На сайте с 09.06.2012
Offline
40
#1
V_G:
Задача: можно ли сначала получить все ссылки которые передаются через функцию.

Только разбирать уже выданное. Как вариант - выдавать сначала в буфер, разбирать, потом выдавать окончательно наружу.

Еще вариант, похожий. Перепишите функцию, чтобы ссылки складывались в глобальный массив (например, $links_arr), а сама функция выдавала код соответствующего элемента массива (например, $links_arr[13]). В конце скрипта производите необходимые операции над массивом, затем (например, через eval()) выдаете закэшированный код наружу.

Вроде, профит! ;)

edogs software
На сайте с 15.12.2005
Offline
775
#2
V_G:
Интересует возможность реализации такого сценария на php.

В скрипте ссылки выводятся по типу
echo sefUrl('здесь_ссылка');

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

Найдите где sefUrl определяется типа

function sefUrl($url) {

измените ее вызов на нечто вроде

function sefUrl($url,$whatToReturn='nothing') {

в саму функцию допишите

static $urlas=array();

///some code of function

if($whatToReturn=='urls') return $urlas; else $urlas[]=$url;

-

в результате урлы будут автозаписываться, а вызов sefUrl('','urls') вернет текущий список оных.

Если же доступа к sefUrl нету (закодировано или типа того), то можно попробовать поставить apd и использовать http://ru2.php.net/override_function

Разработка крупных и средних проектов. Можно с криптой. Разумные цены. Хорошее качество. Адекватный подход. Продаем lenovo legion в спб, дешевле магазинов, новые, запечатанные. Есть разные. skype: edogssoft
maldivec
На сайте с 04.11.2008
Offline
160
#3

Скрипт покажите, иначе по вашему "echo sefUrl('здесь_ссылка');" ничего не понятно.

Если ссылки откуда-то передаются, в чем проблема их получить оттуда же? Или я что-то к ночи уже не соображаю?

K
На сайте с 03.02.2009
Offline
86
#4

Согласен с edogs. sefUrl() чёт не похожа на стандартную функцию. А значит, её можно переопределить. Или там есть какой-то нюанс, в связи с которым нужно оперировать сразу всем массивом, а не каждой ссылкой отдельно?

www.namelisk.com (www.namelisk.com) - домены .ru по 2.99 евро. www.cwspace.net (www.cwspace.net) - хостинг, VPS, dedicated в США и Европе.
Анабой Янсур
На сайте с 12.04.2011
Offline
114
#5

Идея какая. Сначала получить все ссылки которые передаются через sefUrl().

Далее использую полученный массив сделать ОДИН запрос к БД на получение СЕФ-ссылок, и обратно отдать результаты той же самой функции что она вывела результат.

Т.е. сделать по аналогии парсинга уже сгенерированного документа.

bon_eur
На сайте с 09.06.2012
Offline
40
#6
V_G:
Т.е. сделать по аналогии парсинга уже сгенерированного документа.

V_G, можно с минимальными доработками сделать через ob_get_contents() и eval().

IL
На сайте с 20.04.2007
Offline
435
#7
сделать ОДИН запрос к БД на получение СЕФ-ссылок

А там "СЕФ-ссылок"-то много? Может их просто все получать?

А вообще - обычно испльзую способ, похожий на предложенный bon_eur ob_.. (ob_start,ob_get_clean "лаконичнее") + str_replace/preg_replace. callback-функцию для обработки, кстати можно указать сразу при вызове ob_start (http://www.php.net/manual/en/function.ob-start.php#example-455)

bon_eur, не уловил, а как предлагается eval использовать?

... :) Облачные серверы от RegRu - промокод 3F85-3D10-806D-7224 ( http://levik.info/regru )
G
На сайте с 05.02.2012
Offline
73
#8

Тут один я ничего не понял?

Что передается в функцию, что она делает и что возвращает? И чем не устраивает? Лично я ничего не понял.

Карамба!
bon_eur
На сайте с 09.06.2012
Offline
40
#9

ivan-lev, была мысль модифицировать sefUrl(), чтобы она выдавала строки вроде <? echo $links_arr[45];?>. Затем использовать eval(), например в callback-функции, для преобразования этих кусков кода в соответствующие (уже модифицированные, как хочет ТС) значения массива.

Но, по сути, это тот же самый парсинг буфера, да еще и с применением не слишком секьюрной eval().

ТС, предлагаю сделать чуть проще и секьюрнее:

<?


function myfunc($str)
{
global $arr;

// делаем, что хочется, с массивом ссылок
foreach ($arr as $key => $value)
{
$arr[$key] .= '_измененная';
}

/* парсим буфер, заменяем куски вида <?45?> на обновленные значения массива ссылок */
return preg_replace_callback('|<\?(\d+)\?>|', create_function('$m', 'global $arr; return $arr[$m[1]];'), $str);
}

ob_start('myfunc');

$arr = array();

function sefUrl($str)
{
global $arr;

// складываем ссылки в глобальный массив
$arr[] = $str;

// здесь исходный код функции

return '<?' . (count($arr) - 1) . '?>';
}

// далее исходный код скрипта/страницы

echo sefUrl('здесь_ссылка'); ?>

просто текст какой-то

<? echo sefUrl('еще_ссылка');?>

снова текст ни о чем

<?

echo sefUrl('опять_ссылка');

?>

Выдает вот что:

здесь_ссылка_измененная

просто текст какой-то

еще_ссылка_измененная
снова текст ни о чем

опять_ссылка_измененная

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

n0name
На сайте с 22.12.2006
Offline
54
#10

V_G, я так понял, вы всё это затеяли ради увеличения скорости выполнения (сократив количество запросов к СУБД)?

Попробуйте сравнить вариант bon_eur и свой исходный. Вряд ли будет такой уж большой выигрыш, чтобы добавление костылей в код стало оправданным.

Сервис сравнения цена на VPS (http://vpska.com/)
12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий