Вопрос по регулярным выражениям?

Bboy

Новичок
Вопрос по регулярным выражениям?

В поиске был, на питерском сайте решения тоже не нашел.
К сожалению с рег. выражениями совсем не в ладах...

Вобщем вопрос:
Есть много текста, среди к-го встречаются html ссылки вида <a href="http://www.mysite.com" target=_blank title="qwerqwerew">Link</a>

и все это дело в перемешку с текстом, и ссылок таких много.
Из этой каши мне надо получить только "mysite", без com, www и т.д. тобишь имя домена. Некоторые ссылки без www, некоторые без target и title.

Надеюсь на помощь
:rolleyes:
 

Bboy

Новичок
Originally posted by sakon
PHP FAQ: Регулярные выражения. Там есть ответ на твой вопрос. Обязательно пройдись по ссылкам которые там есть.
Может я ошибаюсь, но мне кажется, что решения именно МОЕЙ проблемы там нет.
Во второй части есть работа со ссылками, но это не то.
Внизу страницы есть пример, где описывается как сделать подсветку ссылок, но это тоже не то.
Напомню, что мне надо выделить домен из ссылки.:(
 

SiMM

Новичок
Bboy, и что же, вы каждый раз, при малейшем изменении задачи, будете на форум бегать, чтобы вам добрый дядька за вас сделал вашу работу? Изучайте вопрос - в ваших руках, быть с регулярниками в ладах или нет - не такая уж это непосильная задача. Ковыряйтесь, пробуйте, ошибайтесь и снова пробуйте - будут конкретные вопросы - задавайте их здесь, а подачек в виде готовых решений ждать от жизни не стоит - подобная жизненная позиция не делает вам чести.
PS: при том то, что задачу можно решить и в два действия - готовым регулярником и строковыми функциями - почему-то даже в голову не приходит :(
 
К сожалению с рег. выражениями совсем не в ладах...
в разделе статьи есть основы по регам в мануале тоже есть
изучи основы.

а имеено, выдерать из текста то что ты ищешь между двумя значениями...

например

$stroka = 'abc ajc amc akc';

необходимо выдрать все буквы которые между a и c

самый простейшее рег.в.?

это много времени не займет...

а потом попробуй выдрать

все что между href=" ЛЮБАЯ ССЫЛКА "

успехов....
 

sakon

П..и.н..ок
Bboy

Что не в ладах это точно... Элементарный рег..

$reg = '/(http:\/\/www\.|http:\/\/)(.*?)\.com/';
 

Invader

Guest
Мдя, столько вопросов задают тут по регулярным выражениям, многих они пугают:)
у меня тоже вопрос по ним же.
вот мое выражение
$dom = "http://www.domain.com/index.php";
$t = preg_replace("/(http:\/\/www\.|http:\/\/|www\.)(.+)(\/.*)/","\\2",$dom);

у меня немного другое, из http://www.domain.com/index.php нужно получить domain.com
значитс так, когда строка такого рода все нормально, даже если поле будет
http://www.domain.com/index.php
http://domain.com/index.php
www.domain.com/index.php
domain.com/index.php

все будет нормально работать, и домен будет вырезаться, но если вдруг сайт запишется как http://www.domain.com
то есть без слеша (с параметров или без без разницы уже), то впереди вставляется http://www.
помогите подправить выражение чтобы при любых условиях правильно вырезалось
 

SelenIT

IT-лунатик :)
Invader, в качестве "затравки" для самостоятельного творческого поиска:
PHP:
preg_replace("#(https?://)?(www\.)?([\w\.-_]+?)(/[\w\.-_~]*)*\b#","\\3",$dom);
sakon
1) Пример: http://www.verybadsite.info/~vasya_pupkin/cool-hacker-zone/cracks/command.com/
2) Нафига юзать в качестве ограничителя символ, заведомо присутствующий в обрабатываемой строке? Чтобы конкуренты запутались в обилии экранирующих слешей?
 

SelenIT

IT-лунатик :)
sakon
Если не ошибаюсь, задача ставилась как
Из этой каши мне надо получить только "mysite", без com, www и т.д. тобишь имя домена
Твой элементарный рег, действительно, решает ее для .com... и только, чего, имхо, в общем случае недостаточно ;)
 

SelenIT

IT-лунатик :)
Насколько я понимаю, в идеале, задача состоит из двух частей:
1) Любой допустимый домен должен совпасть с регом;
2) Ни одна строка, не являющаяся допустимым доменом, не должна совпасть с регом.

Практически идеал едва ли достижим, но к нему можно сколь угодно приближаться как со стороны "разрешения", так и со стороны "запрета". В частности, проверять концевой домен можно с разной степенью приближения:
- любые символы от точки до "/" или границы слова;
- от 2 до 6 букв (".museum");
- 2 буквы или один из списка более длинных валидных доменов верхнего уровня;
- полный список валидных доменов верхнего уровня;
- и т.п.

А "показатель качества" проверки, имхо - вероятность того, что она отметет нужную строку или пропустит ненужную...
 

sakon

П..и.н..ок
$reg = '/(http:\/\/www\.|http:\/\/)(.*?)\.\w{2,4}(\/|\"|\b)/';
Вот так будет коректно отрабатывать домен com, ru, info и т.д. Но для этой задачи.... http://www.com тоже совершенно коректно обрабатывается.
 

SelenIT

IT-лунатик :)
sakon

По мелочам:
1) Ну что ты прицепился к этим слешам в качестве ограничителя? Из-за кучи \/\/... рег получается похож на дикобраза. Мало других символов на клавиатуре?
2) Зачем повторять одно и то же "http://" в обеих альтернативах? Не лучше ли вынести его за скобки? Кстати, протокол может быть и https:// (а теоретически еще и ftp://, и mailto: - экзотические варианты, так и быть, отбросим).
3) Доменов верхнего уровня с цифрами лично я пока не встречал (может, и есть такие). А вот пример шестибуквенного привел в прошлом посте.

Ну еще можно, конечно, повозиться с разбором самого доменного имени (исключить варианты короче двух символов, начинающиеся с дефиса и т.п.) - но приближаться к идеалу можно до бесконечности...
 

Bboy

Новичок
Originally posted by sakon
$reg = '/(http:\/\/www\.|http:\/\/)(.*?)\.\w{2,4}(\/|\"|\b)/';
Вот так будет коректно отрабатывать домен com, ru, info и т.д. Но для этой задачи.... http://www.com тоже совершенно коректно обрабатывается.
Млин, и что с этим делать:confused:

Как мне с помощью этого вычленить имя домена в тексте?
 

SiMM

Новичок
> Млин, и что с этим делать
Ты забыл указать сумму пожертвований, которые попадут в карман того, кто всё за тебя напишет.
 

sakon

П..и.н..ок
SelenIT
[off]Мне нравяться ёжики :)[/off]
Согласен, что здесь можно оптимизировать. В главном - это работает. Рассматривать экзотические варианты врядли имеет смысл, проще завести каталог таких доменов. Хотя если довести до абсурда (но работать бут 100%), то (\.com|\.ru|\.org|......|\.museum).


Bboy
Обрати внимание, что мы обсуждаем КАК это работает и в чем работает неправильно, а значит каждый из нас уже выделяет эти домены.... Твое дело просто вставить то, что мы тут понаписали в свой скрипт.
 

Invader

Guest
SelenIT
Работает безукаризненно, спасибо. пойду разберусь с последней частью этого выражения
Уже разобрался, просто сообразить не смог сперва что это такое _ :))ой ужас, деградирую совсем:)....так как \w уже включает это подчеркивание то я обычно его не использую, а тут какой-то символ странный (почти секретный) :)
 
Сверху