Master-X
Форум | Новости | Статьи
Главная » Форум » Программинг, Скрипты, Софт, Сервисы » 
Тема: Запутался в функциях рнр помогите разобраться
цитата
10/02/09 в 03:07
 ibiz
сломал голову, функция нехочет работать icon_sad.gif

есть простая функция:
Код:

function bot($url)
{
        if(eregi("google", $url)){
      $bot = "google";
   }
   elseif(eregi("yahoo", $url)){
      $bot = "yahoo";
   }
   else {
      $bot = "undef";
   }
    return $bot;
}

$url = "http://google.com/searchblabla";

она вызывается из другой функции, другая функция тоже вызывается функцией, итого получилось несколько 3-4 вложенных функций...

если взять отдельно функцию bot($url), то она работает как надо, все возвращает, при этом когда функции вложенные всегда возвращает результат "undef"
eregi пробовал заменять на preg_match и stristr, никакого эффекта
переменная $url в функцию передается, проверял

где я мог накосячить?
цитата
10/02/09 в 04:00
 webboxxx
такого быть не может. сам посмотри по коду - в каком случае в $buf кладется 'undef'? только в одном - когда в строка не содержит ни "google", ни "yahoo". eregi не может то работать, то не работать (к слову здесь грамотнее использовать strpos(), но это другая тема). поэтому проблема может быть только в одном - в $url. сделай так:
Код:
function bot($url)
{
        if(eregi("google", $url)){
      $bot = "google";
   }
   elseif(eregi("yahoo", $url)){
      $bot = "yahoo";
   }
   else {
      $bot = "undef";
   }
echo "bot='$bot'; URL: '$url'";
    return $bot;
}


и смотри чо выводит. 100% дело не в функции.
цитата
10/02/09 в 04:41
 ibiz
ага, уже начал капать в направлении переменной $url icon_smile.gif
грубо говоря вот что получилось:
echo $url; - http://google.com/searchblabla
echo strlen($url); - 2
echo $url[0]; - \
echo $url[1]; - 1
echo $url[0].$url[1]; - http://google.com/searchblabla

тоесть получается переменная содержит два символа "\1", но при выводе на экран выдает то, что надо "http://google.com/searchblabla", как так получается непойму
цитата
10/02/09 в 04:58
 Dim82
попробуй использовать конструкцию switch вместо else... elseif

и как передаётся аргумент $url - по значению или по ссылке?
может быть ситуация, что пока $url передается 3-4 раза в функциях, на входе в bot($url) значение $url будет отличатся от входящего, отсюда и "undef"
цитата
10/02/09 в 13:15
 ibiz
UP
так и не разобрался почему в переменной $url содержится \1, а выводится урл, подскажите ктонить
цитата
10/02/09 в 13:34
 Alexandur
Да ты ...
Да ты ...
Да ты покажи эти функции icon_smile.gif

Команда print_r($url) выведет всё, что может храниться в переменной $url, которая твоими функциями переделывается в массив.
цитата
10/02/09 в 13:38
 webboxxx
ibiz писал:
ага, уже начал капать в направлении переменной $url icon_smile.gif
грубо говоря вот что получилось:
echo $url; - http://google.com/searchblabla
echo strlen($url); - 2
echo $url[0]; - \
echo $url[1]; - 1
echo $url[0].$url[1]; - http://google.com/searchblabla

тоесть получается переменная содержит два символа "\1", но при выводе на экран выдает то, что надо "http://google.com/searchblabla", как так получается непойму


как то странно получается вообще то. даже если url передается по ссылке а не по значению, как может strlen(url) давать 2 не понимаю, все равно должно количество символов возвращать... если до вечера не разберешься, стукни вечером мне в аську, найдем причину. уже аж интересно. ну даже если предположить что все таки с указателями какая-то беда, попробуй в начале функции скопировать url в другую переменную - $tmp = $url; ну и дальше по коду везде изменить. (или в параметрах функции изменить $url на $tmp, а первой строкой $url = $tmp; и потом код менять не придется).
цитата
10/02/09 в 13:48
 ibiz
функции не покажу, ибо там по 1-2к строк...
если делать print_r($url) внутри самой функции, то выводит \1
если сунуть в переменную $tmp и выводить в самой функции, то выводит \1
print ($url) - аналогичный результат

если возвращать результат функции, то выводится нормально strlen = 28

функция вызывается после
$code_url = str_replace('{URL}', '\\1', $code_url);
может в этом косяк
цитата
10/02/09 в 13:48
 webboxxx
а если еще добавить echo urlencode($url); в этой функции, чо выводит?
цитата
10/02/09 в 13:51
 ibiz
urlencode($tmp) - %5C1
цитата
10/02/09 в 13:55
 Alexandur
ibiz писал:
$code_url = str_replace('{URL}', '\\1', $code_url);

str_replace с регулярными не работает

попробуй так:
Цитата:
$code_url = preg_replace('/\{URL\}/', '\\1', $code_url);[/
цитата
10/02/09 в 13:56
 webboxxx
давай полный кусок кода начиная от $code_url = str_replace('{URL}', '\\1', $code_url); и плюс саму функцию со всеми отладочными echo которые ты проставил.
цитата
10/02/09 в 13:57
 webboxxx
gimcnuk писал:
str_replace с регулярными не работает

попробуй так:


он тут их и не использует.
цитата
10/02/09 в 17:48
 Dim82
Попоробуй отследить как меняется $url в функциях, (как писал выше webboxxx $url = $tmp)
$url = $tmp1 в начале,
$url = $tmp2 середине,
$url = $tmp3 в конце.
И повыводить значения $tmp...

Код:
echo $url; - http://google.com/searchblabla
echo strlen($url); - 2

- это как-то подозрительно. что-то преобразовывает $url icon_confused.gif. может при преобразовании строки в массив косяк получается...
цитата
10/02/09 в 19:03
 ibiz
да походу в ссылках запутался...
вот тут какая может быть ошибка?
$text = preg_replace("#\[url\](.*?)\[/url\]#si", bot('\\1'), $text);
цитата
10/02/09 в 19:41
 Dim82
$text = preg_replace('/#\[url\](.*?)\[/url\]#si/', bot('\\1'), $text);

#-?, [/url\] - ? icon_confused.gif
и в квадратных скобках вроде как последовательность символов указывается.
регулярка неправильна - сходу не готов написать как надо, тем более постановки задачи не знаю (что и где заменить надо)

вот тут по уралм и регуляркам, мож пригодится
http://www.pcre.ru/examples/links/text/40/
http://www.phpclub.ru/detail/article/regexp_1
цитата
10/02/09 в 19:55
 ibiz
Dim82: не в регулярке загвоздка, пускай даже она неправильная icon_smile.gif

вот моя логика действий:
$text = preg_replace("#\[url\](.*?)\[/url\]#si", bot('\\1'), $text);
1)для обработки берем весь текст $text
2)то, что между тегами http://google.com/serch.. выделяем, как искомое
3)передаем в функцию bot($url) то, что нашли в тексте
4)в bot($url) обрабатываем полученный урл и возвращаем
5)результатом функции bot($url) заменяем то, что между тегами http://google.com/serch.., тоесть по идее должно получиться http://google.com/serch.. => google
цитата
10/02/09 в 20:12
 ibiz
спасибо heckfy smail54.gif
решил с помощью preg_replace_callback smail101.gif
цитата
10/02/09 в 20:13
 xheckfy
icon_wink.gif


Эта страница в полной версии