Форум программистов, компьютерный форум, киберфорум
Наши страницы
PHP: RegExp
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/23: Рейтинг темы: голосов - 23, средняя оценка - 4.83
VtaMC
Просто Веталь
160 / 100 / 22
Регистрация: 11.05.2009
Сообщений: 628
1

Выявление url с использованием регулярных выражений

21.08.2010, 13:53. Просмотров 4214. Ответов 10
Метки нет (Все метки)

Доброго времени суток!!!
Пытаюсь через регулярные выражения выяснить, есть ли в отосланном сообщении ссылка или нет.
До этого момента не работал с регулярными выражениями...
Само выражение:

PHP
1
#(https?://|[url]ftp://)([/url][[:alnum:]]?.\S(ru|su|net|org|name|ee|fm|dj|biz|info|com.ua|ua|ru.com|it|am))#
Но это выражение работает не так, как я хотел. Оно считает ссылкой, только те конструкции в которых есть, один из перечисленных доменов.

Я хотел, что бы выражение определяло ссылки вида:
_http://site.ru
_http://www.site.ru
_www.site.ru
site.ru

Если никаких признаков ссылки в конструкции нет(ни домен, ни протокол: например site.site), такой текст не должен считаться ссылкой.

А если есть например протокол или www, но домен отсутствует в перечислении, такая конструкция должна считаться ссылкой (например: _http://site.site или _www.site.site)

Помогите составить выражение.
Заранее спасибо!!!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.08.2010, 13:53
Ответы с готовыми решениями:

Поиск с использованием регулярных выражений
Добрый день, уважаемые форумчане! Очень нужен совет.. Нижеизложенный код...

Экранирование с использованием регулярных выражений
Подскажите пожалуйста: у меня есть файл в формате json. В нем есть куски текста...

Парсинг файла с использованием регулярных выражений
Доброго времени суток уважаемые форумчане! Есть такая тема: нужно выдернуть из...

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

Шаблон регулярных выражений
Приветствую всех. Читаю книгу и столкнулся с неточностью. В главе регулярные...

10
SATMAN
52 / 52 / 9
Регистрация: 09.10.2009
Сообщений: 984
21.08.2010, 14:58 2
С инета взял .
PHP
1
2
3
4
5
$value = trim($value);
if (preg_match('/^(http:\/\/|https:\/\/)?([^\.\/]+\.)*([a-zA-Z0-9])([a-zA-Z0-9-]*)\.([a-zA-Z]{2,4})(\/.*)?$/i',$value))
  echo 'Верный домен';
else
  echo 'Не верный домен';
Есть еще в книге но я занят на переписон .

Добавлено через 6 минут
Кароче вроде набросал немного и подправил .. вроде работает как тебе нужно проверяй .
PHP
1
2
3
4
5
6
$value = '_http://www.www.cyberforum.ru';
$value = trim($value);
if (preg_match('/^([_])?(http:\/\/|https:\/\/)?([^\.\/]+\.)*([a-zA-Z0-9])([a-zA-Z0-9-]*)\.([a-zA-Z]{2,4})(\/.*)?$/i',$value))
  echo 'Верный домен';
else
  echo 'Не верный домен';
1
VtaMC
Просто Веталь
160 / 100 / 22
Регистрация: 11.05.2009
Сообщений: 628
21.08.2010, 15:12  [ТС] 3
Но всё равно, мне нужно, что бы там список доменов был. Я пытаюсь например ввести так: site.site, он пишет, что это url. Как такое сделать?
0
SATMAN
52 / 52 / 9
Регистрация: 09.10.2009
Сообщений: 984
21.08.2010, 15:35 4
Проверяй .. я сам не когда не собирал регулярку .. но вроде работает пробуй .
PHP
1
2
3
4
5
6
$value = '_http://www.cyberforum.gav';
$value = trim($value);
if (preg_match('/^([_])?(http:\/\/|https:\/\/)?([^\.\/]+\.)*([a-zA-Z0-9])([a-zA-Z0-9-]*)\.([ru|com|net|org|name|ee|fm|dj|biz|info|su]{2,4})(\/.*)?$/i',$value))
  echo 'Верный домен';
else
  echo 'Не верный домен';
Добавлено через 4 минуты
тебе вот это нужно вынести отдельно .. com.ua такие домена ..
1
Vovan-VE
13160 / 6545 / 1038
Регистрация: 10.01.2008
Сообщений: 15,070
21.08.2010, 18:26 5
Регулярное выражение взято из RFC 2396 - (Uniform Resource Identifiers (URI): Generic Syntax)
^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
Если им проверить строку
http://www.ics.uci.edu/pub/ietf/uri/?foo=bar#Related
то получатся следующие карманы:
  1. http:
  2. http
  3. //www.ics.uci.edu
  4. www.ics.uci.edu
  5. /pub/ietf/uri/
  6. ?foo=bar
  7. foo=bar
  8. #Related
  9. Related
В строке PHP это выражение можно записать так:
PHP
1
preg_match('~^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?~', ...)
Добавлено через 3 минуты

Не по теме:

Ага, я вопроса не понял :)

1
VtaMC
Просто Веталь
160 / 100 / 22
Регистрация: 11.05.2009
Сообщений: 628
21.08.2010, 19:57  [ТС] 6
Цитата Сообщение от SATMAN Посмотреть сообщение
Проверяй .. я сам не когда не собирал регулярку .. но вроде работает пробуй .
PHP
1
2
3
4
5
6
$value = '_http://www.cyberforum.gav';
$value = trim($value);
if (preg_match('/^([_])?(http:\/\/|https:\/\/)?([^\.\/]+\.)*([a-zA-Z0-9])([a-zA-Z0-9-]*)\.([ru|com|net|org|name|ee|fm|dj|biz|info|su]{2,4})(\/.*)?$/i',$value))
  echo 'Верный домен';
else
  echo 'Не верный домен';
Добавлено через 4 минуты
тебе вот это нужно вынести отдельно .. com.ua такие домена ..
Всё равно, ничего не изменилось.

Регулярное выражение взято из RFC 2396 - (Uniform Resource Identifiers (URI): Generic Syntax)
^(([^:/?#]+)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
Это выражение принимает за ссылку даже просто текст.
0
Vovan-VE
13160 / 6545 / 1038
Регистрация: 10.01.2008
Сообщений: 15,070
21.08.2010, 20:18 7

Не по теме:

Цитата Сообщение от VtaMC Посмотреть сообщение
Это выражение принимает за ссылку даже просто текст.
Я плохо вопрос прочитал. Это выражение анализирует URI и извлекает его части.



Добавлено через 18 минут
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$DomainLabel = '[a-z0-9](?:[-a-z0-9]*[a-z0-9])?';
$DomainTopLabel = '[a-z](?:[-a-z0-9]*[a-z])?';
// $DomainTopLabel = '(?:ru|su|com|net|org|info)'; // не очень вариант. замучаешься пересичлять
$Domain = '(?:' . $DomainLabel . '\\.)+' . $DomainTopLabel . '\\.?';
$IPv4 = '\\d+(?:\\.\\d+){3}';
$Host = '(?:' . $Domain . '|' . $IPv4 . ')';
$Proto = 'https?';
$Url = '(?:' . $Proto . '://)?' . $Host;
 
$text = 'foo bar http://example.ru lol baz';
if (preg_match('~' . $Url . '~i', $text, $m)) {
    echo $m[0];
}
else {
    echo 'none';
}
1
SATMAN
52 / 52 / 9
Регистрация: 09.10.2009
Сообщений: 984
21.08.2010, 20:27 8
Цитата Сообщение от VtaMC Посмотреть сообщение
Всё равно, ничего не изменилось.



Это выражение принимает за ссылку даже просто текст.
ХХХХ странно ... я проверял что написал всё работает в норме как вам нужно . Ща подкоректирую текст ..

Добавлено через 7 минут
Цитата Сообщение от Vovan-VE Посмотреть сообщение

Не по теме:


Я плохо вопрос прочитал. Это выражение анализирует URI и извлекает его части.



Добавлено через 18 минут
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$DomainLabel = '[a-z0-9](?:[-a-z0-9]*[a-z0-9])?';
$DomainTopLabel = '[a-z](?:[-a-z0-9]*[a-z])?';
// $DomainTopLabel = '(?:ru|su|com|net|org|info)'; // не очень вариант. замучаешься пересичлять
$Domain = '(?:' . $DomainLabel . '\\.)+' . $DomainTopLabel . '\\.?';
$IPv4 = '\\d+(?:\\.\\d+){3}';
$Host = '(?:' . $Domain . '|' . $IPv4 . ')';
$Proto = 'https?';
$Url = '(?:' . $Proto . '://)?' . $Host;
 
$text = 'foo bar http://example.ru lol baz';
if (preg_match('~' . $Url . '~i', $text, $m)) {
    echo $m[0];
}
else {
    echo 'none';
}
Vovan Ему как раз нужно чтобы концовка проверялась .. на ru \ info , а если выставить trr то он просто должен игнорировать .
0
Vovan-VE
13160 / 6545 / 1038
Регистрация: 10.01.2008
Сообщений: 15,070
21.08.2010, 20:33 9
Цитата Сообщение от SATMAN Посмотреть сообщение
Ему как раз нужно чтобы концовка проверялась .. на ru \ info , а если выставить trr то он просто должен игнорировать .
Дак вторую строку закоментировать и третью раскомментировать
0
VtaMC
Просто Веталь
160 / 100 / 22
Регистрация: 11.05.2009
Сообщений: 628
23.08.2010, 19:45  [ТС] 10
Vovan-VE, я раскомментировал 2 строку и 3-ю закомментировал, но он по прежнему не проверяет по этому списку, точнее на текст вида site.trr он говорит, что это ссылка.
0
dwight
1 / 1 / 0
Регистрация: 25.08.2010
Сообщений: 4
25.08.2010, 22:17 11
Доброго времени суток!
Очень нужна помощь!

Есть строка - html-код. Требуется относительные ссылки перевести в абсолютные(для отправки на мыло).

Примерный алгоритм мне представился в следующем виде:
1. Ищем строку href=" (могут быть пробелы или переносы);
2. Если после найденной строки НЕ идёт текст вроде http:// https:// ftp:// mailto:
- то это относительный url.
3. Если url относительный, меняем href=" на href="www.site.ru/

Думаю нужно использовать функцию preg_replace.
Пытался сам собрать регэксп - получилось чтото вроде

PHP
1
preg_replace('/src\s*=\s*"[^(http:\/\/|https:\/\/|ftp:\/\/|mailto:)]/', '/src\s*=\s*"www.site.ru//', $str);
- не работает, я нуб в регэкспах - ПОЖАЛУЙСТА, ПОМОГИТЕ!
0
25.08.2010, 22:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.08.2010, 22:17

Создание регулярных выражений
помогите написать на php с помощью регулярных выражений задание 4. Имеется...

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

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru