preg_match выражение, как игнорировать символ - PullRequest
1 голос
/ 26 января 2011

Я абсолютно новичок и еще не достиг этого уровня, но мне нужно было иметь возможность разделить домен до только имени хоста для функции поиска.Я посмотрел и нашел это ниже, который в значительной степени работает, за исключением случаев, когда в имени домена есть -.Таким образом, http://www.example.com сокращается до example.com, как и www.example.com, но www.exa-mple.com становится example.com.

$pattern = '/\w+\..{2,3}(?:\..{2,3})?(?:$|(?=\/))/i';
$url = $myurl;
if (preg_match($pattern, $url, $matches) === 1) {

    $mydom = $matches[0];
}

Что необходимо изменить в выражении, чтобы оно приняло -в доменных именах?

Ответы [ 3 ]

5 голосов
/ 26 января 2011

Вам будет лучше с функцией parse_url:

parse_url($url)

Просто добавьте http://, если URL не начинается с него.

0 голосов
/ 26 января 2011
$sites = array('mysite.com',
'www.mysite.com',
'http://www.mysite.com',
'www.my-site.com',
'sub.folder.2.example.com',
'http://www.mysite.com/argh/index.php');

$reg = '%^(?:http://)?(?:[^.]*\.)*([a-zA-Z0-9_-]+\.[a-zA-Z0-9]+)%m';

foreach($sites as $site)
{

    if(preg_match($reg,$site,$matches))
    {
        echo $matches[1],PHP_EOL;
    }
}

Выход:

mysite.com
mysite.com
mysite.com
my-site.com
examle.com
mysite.com
0 голосов
/ 26 января 2011

Ваше регулярное выражение в настоящее время допускает использование символа _ и запрещает использование символа -, что означает, что он принимает недействительные URL-адреса. Вы можете исправить это с помощью следующей группы:

$pattern = '/[a-z0-9-]+\..{2,3}(?:\..{2,3})?(?:$|(?=\/))/i';

Обратите внимание, что с этим все еще есть проблемы. Во-первых, доменные имена не могут начинаться или заканчиваться дефисом. Во-вторых, в настоящее время вы разрешаете ввод любых символов в ДВУ, тогда как они содержат только буквы.

Лучшее решение - использовать правильную библиотеку парсинга URL, а не пытаться делать это самостоятельно.

...