Форум программистов, компьютерный форум, киберфорум
PHP: RegExp
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.65/37: Рейтинг темы: голосов - 37, средняя оценка - 4.65
161 / 101 / 22
Регистрация: 11.05.2009
Сообщений: 628

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

21.08.2010, 13:53. Показов 7330. Ответов 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
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.08.2010, 13:53
Ответы с готовыми решениями:

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

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

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

10
52 / 52 / 9
Регистрация: 09.10.2009
Сообщений: 984
21.08.2010, 14:58
С инета взял .
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
161 / 101 / 22
Регистрация: 11.05.2009
Сообщений: 628
21.08.2010, 15:12  [ТС]
Но всё равно, мне нужно, что бы там список доменов был. Я пытаюсь например ввести так: site.site, он пишет, что это url. Как такое сделать?
0
52 / 52 / 9
Регистрация: 09.10.2009
Сообщений: 984
21.08.2010, 15:35
Проверяй .. я сам не когда не собирал регулярку .. но вроде работает пробуй .
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
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
21.08.2010, 18:26
Регулярное выражение взято из 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
161 / 101 / 22
Регистрация: 11.05.2009
Сообщений: 628
21.08.2010, 19:57  [ТС]
Цитата Сообщение от 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
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
21.08.2010, 20:18

Не по теме:

Цитата Сообщение от 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
52 / 52 / 9
Регистрация: 09.10.2009
Сообщений: 984
21.08.2010, 20:27
Цитата Сообщение от 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
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
21.08.2010, 20:33
Цитата Сообщение от SATMAN Посмотреть сообщение
Ему как раз нужно чтобы концовка проверялась .. на ru \ info , а если выставить trr то он просто должен игнорировать .
Дак вторую строку закоментировать и третью раскомментировать
0
161 / 101 / 22
Регистрация: 11.05.2009
Сообщений: 628
23.08.2010, 19:45  [ТС]
Vovan-VE, я раскомментировал 2 строку и 3-ю закомментировал, но он по прежнему не проверяет по этому списку, точнее на текст вида site.trr он говорит, что это ссылка.
0
1 / 1 / 0
Регистрация: 25.08.2010
Сообщений: 4
25.08.2010, 22:17
Доброго времени суток!
Очень нужна помощь!

Есть строка - 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.08.2010, 22:17
Помогаю со студенческими работами здесь

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

Разборка URL. без регулярных выражений
Необходимо разобрать URL. Используя только строчные функции PHP, а также функции работы с массивами. Регулярными выражениями пользоваться...

Обработка текста с использованием регулярных выражений
Какой вид должно иметь выражение для поиска последовательности длинной 3+ символа, содержащую буквенные символы? При нахождении таковой...

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

Получение информации с использованием регулярных выражений
Добрый. Есть следующая строка на сайте: "descr">35-1000 дней</p> и получить в итоге 35-1000 дней, но не знаю, как получить именно...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru