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
Форумы портала PHP.SU :: Версия для печати :: Помогите написать регулярку
Форумы портала PHP.SU » PHP » Регулярные выражения » Помогите написать регулярку

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

1. Gurina - 10 Октября, 2009 - 19:40:20 - перейти к сообщению
пишу в php.

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

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

Даже не знаю как к этому подступиться... знаю что через preg_match_all, но вот как... хз есть ку кого нибуть более менее готорое решение?
2. koras - 10 Октября, 2009 - 22:33:14 - перейти к сообщению
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 символов и доменное имя любого типа
3. Phantik - 11 Октября, 2009 - 08:22:59 - перейти к сообщению
2 koras, то что стоит в [] выдает только 1 символ поэтому твоя регулярка найдет

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

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

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

[\.\-_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 жду вашего варианта регулярного выражения.


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

ссылка
5. Phantik - 11 Октября, 2009 - 16:44:06 - перейти к сообщению
Твоя регулярка найдет например такую строку:

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

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

Я немного неправильно выразился выше. http:// твоя регулярка тоже найдет.
6. koras - 11 Октября, 2009 - 17:22:09 - перейти к сообщению
Вы правы.

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


$regulyr = "/(http:\/\/)+([\.\-_a-zA-Z0-9]{1,100}[.]{1}[\.A-Za-z0-9]{2,4}[\/]{1}[\.\-_a-zA-Z0-9]{1,20}[\/]{1})/";
7. Phantik - 11 Октября, 2009 - 17:40:38 - перейти к сообщению
Долго объяснять... сейчас нету времени
но под регулярку
"/[http:\/\/]{7}/
подойдут такие строки как 'hh/:ppt' 'ppp:ttt' '//:://p' и еще дофига строг не равных http:// но удовлетворяющих регулярке.
8. koras - 11 Октября, 2009 - 17:46:27 - перейти к сообщению
Не успел запостить

ответ здесь

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})/";
9. Phantik - 11 Октября, 2009 - 17:58:55 - перейти к сообщению
"/(http:\/\/)+([\.\-_a-zA-Z0-9]{1,100}[.]{1}[\.A-Za-z0-9]{2,4}

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

http://..do.m-e.n.hos.t.ru.r
или
http://.................
10. koras - 11 Октября, 2009 - 18:21:35 - перейти к сообщению
Точку включаю для того чтобы регулярное выражение могло искать домен 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})/";
11. movEAX - 11 Октября, 2009 - 22:28:30 - перейти к сообщению
!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 - аналог предыдущего, но с той разницей что домены и юзер неизвестны.

Вобще желательно увидеть пример текста.
12. Gurina - 13 Октября, 2009 - 14:58:58 - перейти к сообщению
Ой, простите, что не заходила долго.. не до этого было.. Огорчение

Вообщем, 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. ?>


Статично: субдомен и домен.
Имя юзера:
CODE (text):
скопировать код в буфер обмена
  1. /^[a-zA-Z0-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. movEAX - 14 Октября, 2009 - 18:33:46 - перейти к сообщению
хм.. тут можно использовать функцию preg_grep('!info|\?get!', $arrResults, PREG_GREP_INVERT);
к полученному массиву с ссылками. Она, в представленной реализации, исключает все ссылки в которых содержится info или ?get и возвращает новый массив. Вроде должно сработать...)
14. Gurina - 15 Октября, 2009 - 00:11:11 - перейти к сообщению
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.         }


Я вот так пока решила, не знаю насколько это правильно... и производительно... но работает..
15. isle - 25 Октября, 2009 - 06:28:37 - перейти к сообщению
Товарищи-программисты, у меня почти аналогичный случай, хочу вытащить из переменной адрес, но никак не выходит, если не сложно, помогите, пожалуйста, нигде загуглить не выходит.

есть переменная, допустим $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];

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

 

Powered by ExBB FM 1.0 RC1