исправление требуется для регулярного выражения, чтобы получить имя сайта - PullRequest
0 голосов
/ 16 августа 2011

Проблема: извлечение чего-либо между http://www. и .com ИЛИ http:// & .com.

Решение:

<?php
$url1='http://www.examplehotel.com';
//$url2='http://test-hotel-1.com';
$pattern='@^http://([^/]+).com@i';
preg_match($pattern, $url1, $matches);
print_r($matches);
?>

Когда $ url1 совпал, он должен вернуть строку'examplehotel'
при совпадении $ url2 должна возвращаться строка 'test-hotel-1'

Работает правильно для $ url2, но пусто для $ url1 ....

Вмой шаблон, который я хочу добавить [http://] или [http://www.] Я добавил (http://)+(www.)+, но совпадения не ожидаются: (.

Могу ли я знать, где я иду не так?

Ответы [ 3 ]

1 голос
/ 16 августа 2011

Проблема в том, что вы сопоставляете все от двух слешей до .com. Если есть www., вы тоже соответствуете этому в своей группе захвата.

Решение состоит в том, чтобы сопоставить www. опционально перед вашей группой захвата, как это

^http://(?:www\.)?([^/]+)\.com
        ^^^^^^^^^^       ^^

(?:www\.)? Это группа без захвата, т. Е. Содержимое не сохраняется в результате. ? в конце делает его необязательным.

\. будет соответствовать литералу ".". . является специальным символом в регулярном выражении и означает «Любой символ».

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

Относительно ваших попыток с [http://] и так далее. Когда вы используете квадратные скобки, вы создаете класс символов, что означает совпадение с одним из символов внутри скобок. Если вы хотите сгруппировать символы, используйте захватывающую () или не захватывающую группу (?:).

1 голос
/ 16 августа 2011

попробуйте это:

$pattern='@^http://(?:www\.)?([^\.]+).com@i';

или в вашем шаблоне вам просто нужно сделать www необязательным (может или не может появиться в шаблоне):

$pattern='@^http://(?:www\.)?([^/]+).com@i';
0 голосов
/ 17 августа 2011
preg_match_all('%http(?:s)?://(?:www\.)?(.*?)\.com%i', $url, $result, PREG_PATTERN_ORDER);
print_r($result[1])
...