Protossan
@Protossan
студент

Как сделать универсальный поиск ссылок с помощью preg_match_all?

Как с помощью одного запроса найти все ссылки которые отвечают таким требованиям:
находятся на доменах mydomain1.com, site.ru, superdomen.org.ru ... число доменов может добавляться. Кроме того ссылка может быть
<a href="_сылка_">...</a>
<a href="_сылка_">...</a>
[url]_сылка_[/url]
[url=_сылка_]...[/URL]
  • Вопрос задан
  • 347 просмотров
Пригласить эксперта
Ответы на вопрос 2
@heartdevil
плыву как воздушный шарик
Привет.

Можно вот так.

Пример

Вот эта часть повторяется три раза
mydomain1\.com.*|site.ru.*|superdomen\.org\.ru.*

Чтобы добавить еще один домен просто используйте такую запись.

Хотим добавить google.com, тогда к вот этой части mydomain1\.com.*|site.ru.*|superdomen\.org\.ru.* добавляем через символ | вот такую запись: google.com.* И получим:
mydomain1\.com.*|site.ru.*|superdomen\.org\.ru.*|google.com.*

Это не самый оптимальный вариант, если хорошенько подумать, том можно придумать лучше), но это один из самых простых способов).
Ответ написан
Комментировать
Protossan
@Protossan Автор вопроса
студент
Ну я смог придумать вот такой вариант:
$string = "some text
  [url]http://dvz.local/index/index/regionId/28[/url]
        <a href=\"http://stuff.ru/roadmap_page.php\">wetrwetwert</a> [url=https://192.168.3.192/roadmap_page.php]qqqqqqqqq[/url]
         [URL]http://www.192.168.3.192/roadmap_page.php#qwe[/URL]";
preg_match_all('#(http|https)://([^\s]*)(192.168.3.192|stuff.ru)([^\s]*)#', $string, $matches);

var_dump($matches);

Он проще в плане добавления нового домена, но есть проблема с окончанием:

array(3) {
    [0]=>
    string(49) "http://stuff.ru/roadmap_page.php">wetrwetwert</a>"
    [1]=>
    string(54) "https://192.168.3.192/roadmap_page.php]qqqqqqqqq[/url]"
    [2]=>
    string(51) "http://www.192.168.3.192/roadmap_page.php#qwe[/URL]"
  }

Т.е. остается последний сегмент тега ссылки. Как его убрать в этой же регулярке, чтоб не цеплять потом str_replace или preg_replace. По сути надо делать отсечения по таким символам - пробел, [, (, ", ' . Но что-то не выходит прикрутить к регулярке. Как это грамотнее сделать?

Решение, полностью удовлетворяющее поставленную задачу.
(http|https)://([^\s]*)(192.168.3.192|stuff.ru)([^\s\[\'\"\]]*)

Спасибо всем кто откликнулся и натолкнул на мысл!
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы