Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Пишу скрипт для работы с поисковыми ботами

14K
07 ноября 2007 года
Progr\.
72 / / 15.10.2007
Встретился с проблемой - не могу нормально составить регулярное выражение для "выдирания" из User-agent'a слова, определяющего браузер. Я делаю так:
 
Код:
if (preg_match("Opera([[:alpha:]]*)", $HTTP_USER_AGENT)) {
  $browser = "Opera";
 }

при этом способе выводиться ошибка:
Цитата:

Warning: preg_match() [function.preg-match]: Delimiter must not be alphanumeric or backslash in z:\home\xxx\www\bots.php on line 32



Пробовал ещё таким способом:

 
Код:
if (eregi("Opera([[:alpha:]]*)", $HTTP_USER_AGENT))  {
  $browser = "Opera";
 }

Тогда всё проходит без ошибки, но eregi возвращает FALSE.

Помогите пожалуйста составить верное выражение для "выдирания" имени браузера.
Какую лучше использовать функцию: eregi или preg_match?
Тестирую с User-Agent'a: Opera/9.22 (Windows NT 5.1; U; ru)
PS: если скажите, что нужно подобрать рег. выражение, в котором после слова Opera должен стоять символ /, то это будет не верно, потому что User-agent оперы может быть ещё таким: "Opera 9.22".
PPS: нужно составить выражение, которое бы подходило и для других браузеров, т.е. чтоб заменялось только начальное слово User-agent'a (имя браузера) а далее шло рег. выражение.

Заранее спасибо.
8
07 ноября 2007 года
mfender
3.5K / / 15.06.2005
ereg уже устарел. его уже нет.
Если хочется регулярными выражениями, то пользуйся preg_math().
preg работает с PCRE, поэтому POSIX твой не прокатит.

Тебе подойдёт примерно такое выражение:

[COLOR=blue]/opera|gecko/i[/COLOR]
[COLOR=#0000ff][/COLOR]
Цитата:
нужно составить выражение, которое бы подходило и для других браузеров, т.е. чтоб заменялось только начальное слово User-agent'a (имя браузера) а далее шло рег. выражение.


это я совсем не понял.

12
07 ноября 2007 года
alekciy
3.0K / / 13.12.2005
И зачем это? Давно уже написанны классы идентифицирующие браузеры и их версию.
14K
08 ноября 2007 года
Progr\.
72 / / 15.10.2007
Цитата:
ereg уже устарел. его уже нет.


то есть? у меня на денвере под PHPH 4.x.x нормально работает. Им то у меня и получается выдернуть браузер

 
Код:
if (eregi("opera", $http_ua)) {
  $browser = "Opera";
 }

eregi проходит, возвращает True, как и надо, когда как preg_match не срабатывает
 
Код:
if (preg_match("opera", $http_ua)) {
  $browser = "Opera";
 }

та же ошибка, что и в 1м посте (в цитате там) и возвращает False.

preg, который вы указали не срабатывает:
 
Код:
if (preg_match("(/opera|gecko/i)", $http_ua)) {
  $browser = "Opera";
 }

eregi срабатывает, но возвращает False

Цитата:
это я совсем не понял.


поняли-поняли, как раз то что нужно и написали (/opera|gecko/i), но это не работает..

Цитата:
И зачем это? Давно уже написанны классы идентифицирующие браузеры и их версию.


Ну самостоятельностью решил заняться :) А если честно - то не знал. Дайте ссылки пожалуйста на то, про что вы говорите.
----------------
Сейчас возникла другая проблема:
как в регулярном выражении записать символ /?
[/]{1} - такое не срабатывает.
Нужно для применения в таком случае:

 
Код:
if ((eregi("opera", $http_ua)) or (eregi("(opera)([/]{1})", $http_ua))) {
  $browser = "Opera";
 }

не срабатывает, возвращает False
12
08 ноября 2007 года
alekciy
3.0K / / 13.12.2005
Цитата: Progr\.

Ну самостоятельностью решил заняться :) А если честно - то не знал.


Все уже давно написано до нас, только не всегда это можно сразу найти. В PHP не юзал ни чего такого, но думаю в гуглей надешь
http://www.google.com/search?ie=UTF-8&hl=ru&q=PHP%20%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%20%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%B1%D1%80%D0%B0%D1%83%D0%B7%D0%B5%D1%80%D0%B0
, а на JS есть Mootools.

Цитата: Progr\.

Сейчас возникла другая проблема:
как в регулярном выражении записать символ /?


http://www.php.net/manual/ru/reference.pcre.pattern.syntax.php
В регулярном выражении у этого слеша нет специального значения. Проблемы могут возникнуть когда используешь его как ограничитель шаблона. Тут выхода 2: 1) экранировать этот слеш обратным слешем, т.е. \/ 2) для ограничения шаблона используй другие символы, как то | ... | или {...} в общем пар много.

14K
08 ноября 2007 года
Progr\.
72 / / 15.10.2007
Цитата:
Все уже давно написано до нас, только не всегда это можно сразу найти. В PHP не юзал ни чего такого, но думаю в гуглей надешь


Большое спасибо, посмотрю, но думаю, полностью под себя заимствовать не буду, ибо уже почти всё сам реализовал.
---------------------
Сейчас не могу разобраться как нужно употребить [:space:], чтоб всё нормально работало... Ткните плиз, как правильно будет, а то я уже замучился подбирать:

 
Код:
eregi("(era)([[:space:]])(mini)", $http_ua)

Пример не сложный, поэтому прошу не давать ссылки на мануалы, а ткуть, так как будет работать. А то уже глаза болят.. весь вечер изучаю RegExp
12
08 ноября 2007 года
alekciy
3.0K / / 13.12.2005
Цитата: Progr\.

Пример не сложный, поэтому прошу не давать ссылки на мануалы, а ткуть, так как будет работать.


Пример действительно не сложный. Насчет ссылок, хм... давали и давать будет, это ветка форума не для стедудентов, тут "напишиме мне" не приветсвуется.

И потом быть может я бы и написал (быть может), но не очень понятно, что ты пытаешься такой регуляркой реализовать. Что ищем то?

8
08 ноября 2007 года
mfender
3.5K / / 15.06.2005
Цитата: Progr\.
то есть? у меня на денвере под PHPH 4.x.x нормально работает.


Ну и? Уже два с половиной года всё человечество активно использует PHP 5.x.x. И ereg в нём является аттавизмом, который очень скоро совсем не будет использоваться. Иначе говоря, всё, что ты сейчас напишешь, вероятно через год не станет работать на хостинге.

14K
08 ноября 2007 года
Progr\.
72 / / 15.10.2007
Цитата:
И потом быть может я бы и написал (быть может), но не очень понятно, что ты пытаешься такой регуляркой реализовать. Что ищем то?


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

Цитата:
Иначе говоря, всё, что ты сейчас напишешь, вероятно через год не станет работать на хостинге.


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

 
Код:
if ($namesbot == ("gogle" or "googl" or "gooog" or "feedf" or "media")) { }

тогда, как
 
Код:
if (($namesbot == "gogle") or ($namesbot == "googl") or ($namesbot == "gooog") or ($namesbot == "feedf") or ($namesbot == "media")) { }

работает нормально. Что нужно сделать, чтоб 1й пример стал "перевариваться" пхп? Я там, наверно, допускаю ошибку, только какую?
12
08 ноября 2007 года
alekciy
3.0K / / 13.12.2005
Цитата: Progr\.
Я там, наверно, допускаю ошибку, только какую?


Логическую.
Задумайся, что у тебя возращает конструкция "gogle" or "googl".

12
08 ноября 2007 года
alekciy
3.0K / / 13.12.2005
Цитата: Progr\.
Просто есть браузеры Opera и Opera Mini и я не хочу, чтоб опера мини определялась, как опера, поэтому и нужно такое выражение (с пробелом между словами).


Ох, как же все не то мутишь. Все элементарно:

Код:
<?php

$pattern = "/(Opera\sMini)/iu";

$subject = 'тут что то Opera Mini еще какие то символы';
$subject1 = 'тут что то Opera еще какие то символы';

$regExp = preg_match($pattern,$subject);
var_dump($regExp);

echo '<br>';

$regExp = preg_match($pattern,$subject1);
var_dump($regExp);
?>

Я тебе не зря отсылаю ман курить, если бы удосижился его прочесть, то вопроса бы о кодировании символа пробела не возник бы.

RTFM, RTFM и снова RTFM!!!!!!
14K
08 ноября 2007 года
Progr\.
72 / / 15.10.2007
Цитата:
Задумайся, что у тебя возращает конструкция "gogle" or "googl".


если в $namesbot = этим выражениям, то TRUE (или я ошибаюсь?). Просто в $namesbot присваивается значение 5 первых сиволов из User-agent'a. Мне просто нужно упростить ту конструкцию, чтоб не использовать пример №2.
-------------------------
Вопрос, наверно, не в тему, да и не в соответствующий раздел, но: где можно взять описание агентов: Гугла, Мэйла, Рамблера, Яхо, Апорта, ВебАльты, МСНа? Нужно их точные User-Agent'ы и описание для каждого (кто, что делает. Например, как для яши тут)

14K
08 ноября 2007 года
Progr\.
72 / / 15.10.2007
alekciy, что-то твой код, вроде, не работоспособный...
[HTML]
int(0)
int(0)
[/HTML]
Цитата:
Я тебе не зря отсылаю ман курить, если бы удосижился его прочесть, то вопроса бы о кодировании символа пробела не возник бы.


сейчас прочтём-с :)

12
08 ноября 2007 года
alekciy
3.0K / / 13.12.2005
Цитата: Progr\.
alekciy, что-то твой код, вроде, не работоспособный...
[HTML]
int(0)
int(0)
[/HTML]


Так у тебя же PHP левый! :D
У меня как и положено:
[HTML]
int(1)
int(0)
[/HTML]

14K
08 ноября 2007 года
Progr\.
72 / / 15.10.2007
Цитата:
Так у тебя же PHP левый!


Хм... PHP, что и с денвером идет.. Странно
/me озадачен вопросом: "будет ли работать весь мой скрипт на хостинге, при таком раскладе?"

12
08 ноября 2007 года
alekciy
3.0K / / 13.12.2005
Цитата: Progr\.
Хм... PHP, что и с денвером идет.. Странно


Блин... сколько уже раз говОренно, что денвер зло особо в самом начале. Проставь Апач и пых как это описывают через статьи, т.е. апач ставь через инсталлер скачаный с офсайта (лучше 2.0.х) + берем просто архив с PHP и копируем его в папку апача.

14K
09 ноября 2007 года
Progr\.
72 / / 15.10.2007
alekciy, спасибо за ссылку на рег. выражения :) Изучил и всё стало ясно :) Сейчас всё прекрасно работает, почти дописал весь скрипт (админ-управление осалось)
---------------------
Вопрос насчет апача. В стандартной комплектации вышесказанного апача возможно создание виртуальных сайтов "на лету"? Т.е., как в денвере: создал папку, перегрузил сервер - виртуалка создана.
12
10 ноября 2007 года
alekciy
3.0K / / 13.12.2005
Цитата: Progr\.
В стандартной комплектации вышесказанного апача возможно создание виртуальных сайтов "на лету"?


Смотря что подразумевать под "на лету". Кофиг апача это обычный текстовой файл, причем во время работы оного он ни как не блокируется. Вирутальные сервера перечесляются в секции 3 этого файла. К апачу есть команды "мягкого" перезапуска, когда файл конфига перечитывается без перезагрузки сервера.

Выводы делай сам.

14K
10 ноября 2007 года
Progr\.
72 / / 15.10.2007
Подскажите пожалуйста, как поставить указатель в файле в том месте, где мне надо (нужно конец файла-1 строка (1 строка=17 символов с \n))? Это нужно чтоб считать эту строку и продолжить с ней работу.
Я делаю так:
 
Код:
$filelastsbots = @fopen($botdir.$last_bots, "ab"); // открываю файл
    $fileseek = fseek($filelastsbots, 0, SEEK_END); // ставлю на последнюю строку
    $filetell = ftell($filelastsbots); // считываю количество сиволов
    $filenumrow = $filetell/17; // делю на 17; нужно, чтоб узнать количество строк (по 17 сиволов в строке, считая \n)
    $filenumrowmo = $filenumrow-1; // присваиваю переменной значение "последняя строка-1 строка"

Какой функцией дальше установить позицию указателя?


На http://www.php.net/manual/ru/index.php Почему то не заходит :(
12
10 ноября 2007 года
alekciy
3.0K / / 13.12.2005
Зачем изобретать какие либо сложности?
http://www.php.net/manual/ru/function.file.php
Ну и мануал чаще читаем, там все написано.
14K
11 ноября 2007 года
Progr\.
72 / / 15.10.2007
alekciy, как всегда выручил! Спасибо!
Я сделал функцией file()
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог