С нами с 24.10.04
Сообщения: 18881
Рейтинг: 9010
|
Добавлено: 10/02/09 в 03:07 |
сломал голову, функция нехочет работать
есть простая функция:
Код: |
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 в функцию передается, проверял
где я мог накосячить?
|
|
|
|
С нами с 06.03.03
Сообщения: 1650
Рейтинг: 1096
|
Добавлено: 10/02/09 в 04:00 |
такого быть не может. сам посмотри по коду - в каком случае в $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% дело не в функции.
|
|
|
|
С нами с 24.10.04
Сообщения: 18881
Рейтинг: 9010
|
Добавлено: 10/02/09 в 04:41 |
ага, уже начал капать в направлении переменной $url
грубо говоря вот что получилось:
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", как так получается непойму
|
|
|
|
ищу работу (php,mysql,js)
С нами с 26.05.07
Сообщения: 576
Рейтинг: 393
|
Добавлено: 10/02/09 в 04:58 |
попробуй использовать конструкцию switch вместо else... elseif
и как передаётся аргумент $url - по значению или по ссылке?
может быть ситуация, что пока $url передается 3-4 раза в функциях, на входе в bot($url) значение $url будет отличатся от входящего, отсюда и "undef"
|
|
|
|
С нами с 24.10.04
Сообщения: 18881
Рейтинг: 9010
|
Добавлено: 10/02/09 в 13:15 |
UP
так и не разобрался почему в переменной $url содержится \1, а выводится урл, подскажите ктонить
|
|
|
|
С нами с 01.04.07
Сообщения: 4378
Рейтинг: 2970
|
Добавлено: 10/02/09 в 13:34 |
Да ты ...
Да ты ...
Да ты покажи эти функции
Команда print_r($url) выведет всё, что может храниться в переменной $url, которая твоими функциями переделывается в массив.
|
|
|
|
С нами с 06.03.03
Сообщения: 1650
Рейтинг: 1096
|
Добавлено: 10/02/09 в 13:38 |
ibiz писал: | ага, уже начал капать в направлении переменной $url
грубо говоря вот что получилось:
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; и потом код менять не придется).
|
|
|
|
С нами с 24.10.04
Сообщения: 18881
Рейтинг: 9010
|
Добавлено: 10/02/09 в 13:48 |
функции не покажу, ибо там по 1-2к строк...
если делать print_r($url) внутри самой функции, то выводит \1
если сунуть в переменную $tmp и выводить в самой функции, то выводит \1
print ($url) - аналогичный результат
если возвращать результат функции, то выводится нормально strlen = 28
функция вызывается после
$code_url = str_replace('{URL}', '\\1', $code_url);
может в этом косяк
|
|
|
|
С нами с 06.03.03
Сообщения: 1650
Рейтинг: 1096
|
Добавлено: 10/02/09 в 13:48 |
а если еще добавить echo urlencode($url); в этой функции, чо выводит?
|
|
|
|
С нами с 24.10.04
Сообщения: 18881
Рейтинг: 9010
|
Добавлено: 10/02/09 в 13:51 |
urlencode($tmp) - %5C1
|
|
|
|
С нами с 01.04.07
Сообщения: 4378
Рейтинг: 2970
|
Добавлено: 10/02/09 в 13:55 |
ibiz писал: | $code_url = str_replace('{URL}', '\\1', $code_url); |
str_replace с регулярными не работает
попробуй так:
Цитата: | $code_url = preg_replace('/\{URL\}/', '\\1', $code_url);[/ |
|
|
|
|
С нами с 06.03.03
Сообщения: 1650
Рейтинг: 1096
|
Добавлено: 10/02/09 в 13:56 |
давай полный кусок кода начиная от $code_url = str_replace('{URL}', '\\1', $code_url); и плюс саму функцию со всеми отладочными echo которые ты проставил.
|
|
|
|
С нами с 06.03.03
Сообщения: 1650
Рейтинг: 1096
|
Добавлено: 10/02/09 в 13:57 |
gimcnuk писал: | str_replace с регулярными не работает
попробуй так: |
он тут их и не использует.
|
|
|
|
ищу работу (php,mysql,js)
С нами с 26.05.07
Сообщения: 576
Рейтинг: 393
|
Добавлено: 10/02/09 в 17:48 |
Попоробуй отследить как меняется $url в функциях, (как писал выше webboxxx $url = $tmp)
$url = $tmp1 в начале,
$url = $tmp2 середине,
$url = $tmp3 в конце.
И повыводить значения $tmp...
- это как-то подозрительно. что-то преобразовывает $url . может при преобразовании строки в массив косяк получается...
|
|
|
|
С нами с 24.10.04
Сообщения: 18881
Рейтинг: 9010
|
Добавлено: 10/02/09 в 19:03 |
да походу в ссылках запутался...
вот тут какая может быть ошибка?
$text = preg_replace("#\[url\](.*?)\[/url\]#si", bot('\\1'), $text);
|
|
|
|
ищу работу (php,mysql,js)
С нами с 26.05.07
Сообщения: 576
Рейтинг: 393
|
Добавлено: 10/02/09 в 19:41 |
|
|
|
|
С нами с 24.10.04
Сообщения: 18881
Рейтинг: 9010
|
Добавлено: 10/02/09 в 19:55 |
Dim82: не в регулярке загвоздка, пускай даже она неправильная
вот моя логика действий:
$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
|
|
|
|
С нами с 24.10.04
Сообщения: 18881
Рейтинг: 9010
|
Добавлено: 10/02/09 в 20:12 |
спасибо heckfy
решил с помощью preg_replace_callback
|
|
|
|
С нами с 04.04.07
Сообщения: 62
Рейтинг: 37
|
Добавлено: 10/02/09 в 20:13 |
|
|
|
|