Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Помогите написать регулярку

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (3): [1] 2 3 »   

> Без описания
Gurina
Отправлено: 10 Октября, 2009 - 19:40:20
Post Id



Новичок


Покинул форум
Сообщений всего: 26
Дата рег-ции: Окт. 2009  


Помог: 0 раз(а)




пишу в php.

Дано:
Переменная с текстом

Надо:
Выдрать из переменной все ссылки подходящие под условие http://субдомен[dot]домен[dot]ru/ник_юзера/ (при этом в линке куча еще всякой не нужной лабуды содержится типа http://субдомен[dot]домен[dot]ru/ник_юзера/хеш/еще какая-то хрень )

Даже не знаю как к этому подступиться... знаю что через preg_match_all, но вот как... хз есть ку кого нибуть более менее готорое решение?
 
 Top
koras
Отправлено: 10 Октября, 2009 - 22:33:14
Post Id



Частый гость


Покинул форум
Сообщений всего: 224
Дата рег-ции: Окт. 2009  


Помог: 0 раз(а)




CODE (text):
скопировать код в буфер обмена
  1. "/[http:\/\/]{7}[\.\-_a-zA-Z0-9]{1,100}[.]{1}[\.A-Za-z0-9]{2,4}[\/]{1}[\.\-_a-zA-Z0-9]{1,20}[\/]{1}/"
  2.  


Проверить правда нет возможности, попробуйте, потом отпишитесь.Навоял на скорую руку.

Это с учетом того что в нике пользователя будет от 1 до 20 символов и доменное имя любого типа

(Отредактировано автором: 11 Октября, 2009 - 17:22:59)

 
 Top
Phantik
Отправлено: 11 Октября, 2009 - 08:22:59
Post Id


Посетитель


Покинул форум
Сообщений всего: 305
Дата рег-ции: Июнь 2009  


Помог: 0 раз(а)




2 koras, то что стоит в [] выдает только 1 символ поэтому твоя регулярка найдет

и
hhhhhhh и ttttttt и /////// и ::::::: и много чего еще
только не найдет само http://

с остальными квадратными скобками аналогично.

2 Gurina
что бы написать регулярку для тебя желательно еще знать ограничения на
субдомен, домен, ник_юзера. Какие символы могут входить и ограничение на длинну
 
 Top
koras
Отправлено: 11 Октября, 2009 - 16:12:40
Post Id



Частый гость


Покинул форум
Сообщений всего: 224
Дата рег-ции: Окт. 2009  


Помог: 0 раз(а)




Я просто дописал свою регулярку которая работает и в полне успешно.

[\.\-_a-zA-Z0-9]{1,100}[.]{1}[\.A-Za-z0-9]{2,4}

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

Цитата:
что бы написать регулярку для тебя желательно еще знать ограничения на
субдомен,

написал выше

ник_юзера. Какие символы могут входить и ограничение на длинну


Согласен, но одно но. Здесь и так видно что ник пользователя будет идти после домена и до слеша. То есть все символы английского алфавита от конца зоны.

обрезаем "http://host[dot]host(любое количество).zone / ник пользователя /" обрезаем



Переборол свою лень и написал как надо.



PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. # регулярное выражение
  3.  
  4. $regulyr = "/[http:\/\/]{7}[\.\-_a-zA-Z0-9]{1,100}[.]{1}[\.A-Za-z0-9]{2,4}[\/]{1}[\.\-_a-zA-Z0-9]{1,20}[\/]{1}/";
  5. # где ищем
  6. $text = "<b>example: </b><div alignjsacelienrtvlwerkjt zxcvzxcvhhhhhhhhttp://host.domen.ru/privet_romashka/sdafasdfasdfas dasdf +-asdf asasdisd afi8erh 4qtleft>this is a test</div>";
  7. preg_match_all( $regulyr, $text, $out, PREG_PATTERN_ORDER);
  8. echo $out[0][0]."\n";
  9. ?>
  10.  

Можете проверить код.


Phantik жду вашего варианта регулярного выражения.


Вот рабочий код ))

ссылка

(Отредактировано автором: 11 Октября, 2009 - 16:36:00)

 
 Top
Phantik
Отправлено: 11 Октября, 2009 - 16:44:06
Post Id


Посетитель


Покинул форум
Сообщений всего: 305
Дата рег-ции: Июнь 2009  


Помог: 0 раз(а)




Твоя регулярка найдет например такую строку:

/ttp/h:.host.domain.ru/privet и.т.д.

Хотя эта строка не правильна.

Я немного неправильно выразился выше. http:// твоя регулярка тоже найдет.

(Отредактировано автором: 11 Октября, 2009 - 17:20:51)

 
 Top
koras
Отправлено: 11 Октября, 2009 - 17:22:09
Post Id



Частый гость


Покинул форум
Сообщений всего: 224
Дата рег-ции: Окт. 2009  


Помог: 0 раз(а)




Вы правы.

Сейчас подумаю как правильно должно быть


$regulyr = "/(http:\/\/)+([\.\-_a-zA-Z0-9]{1,100}[.]{1}[\.A-Za-z0-9]{2,4}[\/]{1}[\.\-_a-zA-Z0-9]{1,20}[\/]{1})/";

(Отредактировано автором: 11 Октября, 2009 - 17:42:56)

 
 Top
Phantik
Отправлено: 11 Октября, 2009 - 17:40:38
Post Id


Посетитель


Покинул форум
Сообщений всего: 305
Дата рег-ции: Июнь 2009  


Помог: 0 раз(а)




Долго объяснять... сейчас нету времени
но под регулярку
"/[http:\/\/]{7}/
подойдут такие строки как 'hh/:ppt' 'ppp:ttt' '//:://p' и еще дофига строг не равных http:// но удовлетворяющих регулярке.
 
 Top
koras
Отправлено: 11 Октября, 2009 - 17:46:27
Post Id



Частый гость


Покинул форум
Сообщений всего: 224
Дата рег-ции: Окт. 2009  


Помог: 0 раз(а)




Не успел запостить

ответ здесь

http://forum.php.su/topic.php?fo...70929#1255270929


CODE (text):
скопировать код в буфер обмена
  1. $regulyr = "/(http:\/\/)+([\.\-_a-zA-Z0-9]{1,100}[.]{1}[\.A-Za-z0-9]{2,4}[\/]{1}[\.\-_a-zA-Z0-9]{1,20}[\/]{1})/";
 
 Top
Phantik
Отправлено: 11 Октября, 2009 - 17:58:55
Post Id


Посетитель


Покинул форум
Сообщений всего: 305
Дата рег-ции: Июнь 2009  


Помог: 0 раз(а)




"/(http:\/\/)+([\.\-_a-zA-Z0-9]{1,100}[.]{1}[\.A-Za-z0-9]{2,4}

Ты точку включаешь в класс, т.е. строки следущего плана тоже подойдут к твоей регулярке:

http://..do.m-e.n.hos.t.ru.r
или
http://.................

(Отредактировано автором: 11 Октября, 2009 - 18:04:18)

 
 Top
koras
Отправлено: 11 Октября, 2009 - 18:21:35
Post Id



Частый гость


Покинул форум
Сообщений всего: 224
Дата рег-ции: Окт. 2009  


Помог: 0 раз(а)




Точку включаю для того чтобы регулярное выражение могло искать домен 2 и выше лвл.

http://.................
или

http://..do.m-e.n.hos.t.ru.r
он искать не будет

возможно только будет искать

http://..do.m-e.n.hos.t.ru.r/privet_romashka/

или

http://..........r/privet_romashka/


Не знаю как убрать с условия две точки подрят, отрицание надо + с зоны надо точку убрать и цифры. Вроде нет цифр в зонах. Я не встречал.



$regulyr = "/(http:\/\/)+([\.\-_a-zA-Z0-9]{1,100}[.]{1}[A-Za-z]{2,4}[\/]{1}[\.\-_a-zA-Z0-9]{1,20}[\/]{1})/";
 
 Top
movEAX
Отправлено: 11 Октября, 2009 - 22:28:30
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 750
Дата рег-ции: Авг. 2009  


Помог: 16 раз(а)




!http://subdomen\.domen\.ru/user_name[^"]*!m - эта регулярка рассчитана на текст подобного рода: href="http://subdomen.domen.ru/user_nam/sdgdgd/fsgdfg/".
В результате получим http://subdomen.domen.ru/user_nam/sdgdgd/fsgdfg/.

!http://[\w\d]+?\.[\w\d]+?\.ru/[^"]+!m - аналог предыдущего, но с той разницей что домены и юзер неизвестны.

Вобще желательно увидеть пример текста.

(Отредактировано автором: 11 Октября, 2009 - 22:33:16)



-----
армия.. самое убогое место
 
 Top
Gurina
Отправлено: 13 Октября, 2009 - 14:58:58
Post Id



Новичок


Покинул форум
Сообщений всего: 26
Дата рег-ции: Окт. 2009  


Помог: 0 раз(а)




Ой, простите, что не заходила долго.. не до этого было.. Огорчение

Вообщем, movEAX, ты умничка Радость
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. $link="server";
  3. $text=file_get_contents($link);
  4.  
  5. preg_match_all('!http://субдомен\.домен\.ru/[^"]+!m', $text, $regs);
  6. echo "<pre>";
  7. print_r($regs);
  8. echo "</pre>";
  9. ?>


Статично: субдомен и домен.
Имя юзера:
Из списка надо исключить некоторый набор адресов типа http://субдомен.домен.ru/info/*, http://субдомен[dot]домен[dot]ru/?get=*
Желательно обрезать до http://субдомен[dot]домен[dot]ru/имя пользователя/ (если не возможно, обрежу сама Улыбка )

Вообщем получилось вот это:
PHP:
скопировать код в буфер обмена
  1. preg_match_all('!http://субдомен\.домен\.ru/[^"]+/!m', $text, $regs);

как раз в массив заносит данные http://субдомен[dot]домен[dot]ru/юзер или страница/
осталось как-то вбить страницы, чтоб они не обрабатывались

(Отредактировано автором: 13 Октября, 2009 - 16:56:16)

 
 Top
movEAX
Отправлено: 14 Октября, 2009 - 18:33:46
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 750
Дата рег-ции: Авг. 2009  


Помог: 16 раз(а)




хм.. тут можно использовать функцию preg_grep('!info|\?get!', $arrResults, PREG_GREP_INVERT);
к полученному массиву с ссылками. Она, в представленной реализации, исключает все ссылки в которых содержится info или ?get и возвращает новый массив. Вроде должно сработать...)


-----
армия.. самое убогое место
 
 Top
Gurina
Отправлено: 15 Октября, 2009 - 00:11:11
Post Id



Новичок


Покинул форум
Сообщений всего: 26
Дата рег-ции: Окт. 2009  


Помог: 0 раз(а)




PHP:
скопировать код в буфер обмена
  1. $link="Линк";
  2. $text=file_get_contents($link);
  3.  
  4. preg_match_all('!http://субдомен\.домен\.ru/[^"]+/!m', $text, $regs);
  5. $regs[0] = array_unique ($regs[0]);
  6. foreach ($regs[0] as $ank) {
  7.     if ($ank!="http://субдомен.домен.ru/help/" and $ank!="http://субдомен.домен.ru/index/")
  8.     {
  9.         // обработчик
  10.         }


Я вот так пока решила, не знаю насколько это правильно... и производительно... но работает..
 
 Top
isle
Отправлено: 25 Октября, 2009 - 06:28:37
Post Id



Гость


Покинул форум
Сообщений всего: 111
Дата рег-ции: Окт. 2009  
Откуда: Казахстан, Алматы


Помог: 0 раз(а)




Товарищи-программисты, у меня почти аналогичный случай, хочу вытащить из переменной адрес, но никак не выходит, если не сложно, помогите, пожалуйста, нигде загуглить не выходит.

есть переменная, допустим $url, которая может содержать, например, такой адрес:

_http://www[dot]subdomaim[dot]domaim[dot]com/blog/oleg/index.php

Я хочу получить только домен и, если есть, то папку блога, но без лишних символов. Например, должно получиться как-то так (без "http://", "www", третьей вложенной папки и всяких слешей):

subdomaim.domaim.com/blog

К сожалению, пример 3 (http://www.php.su/functions/?preg-match) работает, но не обрезает левые "www.@ и почему-то срезает вложенную папку блога.

Был бы очень благодарен за вашу подсказку. Улыбка

================================ ===

Обновление:

Методом проб и ошибок получил такое:

preg_match("/^(http:\/\/)?(www.)?([^\/]+)/i",$url,$matches);
$url2 = $matches[3];

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

(Отредактировано автором: 25 Октября, 2009 - 07:26:00)

 
 Top
Страниц (3): [1] 2 3 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Регулярные выражения »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB