Извлечь домены из из текста

185
14 ноября 2018, 17:10

1.На входе есть строка(Строка для примера, она может быть очень большая):

49 0 0 wiki.nashtransport.ru wiki.nashtransport.ru/ 27184 23232 mignews.ru mignews.ru/27182 67 сергиев-посад.рф тут еще какая-то инфа. domen.ru тут куча текста

  1. Нужно выбрать со строки все доменные имена.

Т.е. На выходе должно получиться следующее:

wiki.nashtransport.ru
mignews.ru
сергиев-посад.рф
domen.ru

Как реализовать подобное?

Answer 1

Изначально имеем текст:

$text = '49 0 0 wiki.nashtransport.ru wiki.nashtransport.ru/ 27184 23232 mignews.ru 
mignews.ru/27182 67 сергиев-посад.рф тут еще какая-то инфа. domen.ru тут куча текста';

Воспользуемся следующим регулярным выражением:

preg_match_all('~[\w.-]+(?:ru|рф)~mui', $text, $matches);
print_r($matches);

В результате получаем:

Array
(
    [0] => Array
        (
            [0] => wiki.nashtransport.ru
            [1] => wiki.nashtransport.ru
            [2] => mignews.ru
            [3] => mignews.ru
            [4] => сергиев-посад.рф
            [5] => domen.ru
        )
)

Если регулярное выражение захватит неправильные доменные имена, то вы можете отфильтровать массив доменов, следующим способом:

$array = array_filter($matches[0], function ($x) {
   return (filter_var('http://'.($x), FILTER_VALIDATE_URL)) ? true : false;
});
print_r($array);

Но, в мануале написано:

Обратите внимание, что эта функция считает корректными только URL, состоящие из символов ASCII; Интернациональные доменные имена не пройдут проверку.

Поэтому следует сначала воспользоваться библиотекой IDNA, к примеру эта.

Например, домен сергиев-посад.рф в итоге преобразуется в xn----8sbedibbx1djfkj.xn--p1ai. Тем самым в итоге он пройдет проверку с фильтрацией URL.

Answer 2
<?php
    $text="49 0 0 wiki.nashtransport.ru wiki.nashtransport.ru/ 27184 2323 49 0 0 wiki.nashtransport.ru1 wiki.nashtransport.ru1/ 27184 2323 49 0 0 wiki.nashtransport.ru2 wiki.nashtransport.ru2/ 27184 2323";
    // переворачиваем текст для извлечения строки между \ и пробелом
    $text=strrev($text);
    preg_match_all("!/(.*?)\s!si",$text,$result);


foreach($result as $key=>$val) 
  {
        foreach($val as $key=>$vals) 
        {
            if (preg_match("/^([a-z\d](-*[a-z\d])*)(\.([a-z\d](-*[a-z\d])*))*$/i",$vals))
            { 

            // переворачиваем текст обратно
            $vals=strrev($vals);
            echo $vals."</br>";

            }
        }
   }
?>
READ ALSO
Как изменить переменную GET через js

Как изменить переменную GET через js

Есть переменная в URL page, есть функция load в js надо перед вызовом функции изменить переменную GETНапример:

171
Вопрос по POST запросу

Вопрос по POST запросу

не понимаю как сделать проверкуУ меня есть код

176
Как изменить формат Url для пагинации в joomshopping?

Как изменить формат Url для пагинации в joomshopping?

Может кто нибудь уже сталкивался с этой проблемой и знает ее решениеНеобходимо настроить ЧПУ пагинацию

152
Symfony __construct

Symfony __construct

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

156