Есть много способов сделать это. Простая замена - самая быстрая, если вы знаете, что всегда хотите удалить «www.»
$stripped=str_replace('www.', '', $domain);
Замена регулярного выражения позволяет связать это совпадение с началом строки:
$stripped=preg_replace('/^www\./', '', $domain);
Если это всегда первая часть домена, независимо от того, является ли он www, вы можете использовать explode / implode. Хотя его легко прочитать, это самый неэффективный метод:
$parts=explode('.', $domain);
array_shift($parts); //eat first element
$stripped=implode('.', $parts);
регулярное выражение достигает той же цели более эффективно:
$stripped=preg_replace('/^\w+\./', '', $domain);
Теперь вы можете представить, что следующее будет более эффективным, чем приведенное выше регулярное выражение:
$period=strpos($domain, '.');
if ($period!==false)
{
$stripped=substr($domain,$period+1);
}
else
{
$stripped=$domain; //there was no period
}
Но я проверил это и обнаружил, что за миллион итераций версия preg_replace
постоянно побеждала. Типичные результаты, нормализованные к самому быстрому (поэтому у него есть единичное время 1):
- Простая str_replace: 1
- preg_replace с
/^\w+\./
: 1.494
- strpos / substr: 1.982
- взорваться / взорваться: 2,472
Приведенные выше примеры кода всегда удаляют первый компонент домена, поэтому будут отлично работать на доменах, таких как "www.example.com" и "www.example.co.uk", но не на "example.com" или "www. department.example.com». Если вам нужно обрабатывать домены, которые уже могут быть основным доменом или иметь несколько поддоменов (например, «foo.bar.baz.example.com») и хотите уменьшить их до основного домена («example.com») попробуйте следующее. Первый пример в каждом подходе возвращает только два последних компонента домена, поэтому не будет работать с доменами, подобными co.uk.
explode
$parts = explode('.', $domain);
$parts = array_slice($parts, -2);
$stripped = implode('.', $parts);
Поскольку explode
является самым медленным подходом, нет смысла писать версию, которая обрабатывает "co.uk".
регулярное выражение:
$stripped=preg_replace('/^.*?([^.]+\.[^.]*)$/', '$1', $domain);
Это захватывает последние две части из домена и заменяет полное строковое значение захваченной частью. При наличии нескольких поддоменов все ведущие части удаляются.
Чтобы работать с доменами, подобными ".co.uk", а также с переменным количеством поддоменов, попробуйте:
$stripped=preg_replace('/^.*?([^.]+\.(?:[^.]*|[^.]{2}\.[^.]{2}))$/', '$1', $domain);
ул:
$end = strrpos($domain, '.') - strlen($domain) - 1;
$period = strrpos($domain, '.', $end);
if ($period !== false) {
$stripped = substr($domain,$period+1);
} else {
$stripped = $domain;
}
Разрешение для доменов co.uk:
$len = strlen($domain);
if ($len < 7) {
$stripped = $domain;
} else {
if ($domain[$len-3] === '.' && $domain[$len-6] === '.') {
$offset = -7;
} else {
$offset = -5;
}
$period = strrpos($domain, '.', $offset);
if ($period !== FALSE) {
$stripped = substr($domain,$period+1);
} else {
$stripped = $domain;
}
}
Реализации на основе регулярных выражений и str могут быть сделаны очень немного быстрее, жертвуя крайними случаями (где компонент основного домена представляет собой одну букву, например, "a.com"):
регулярное выражение:
$stripped=preg_replace('/^.*?([^.]{3,}\.(?:[^.]+|[^.]{2}\.[^.]{2}))$/', '$1', $domain);
ул:
$period = strrpos($domain, '.', -7);
if ($period !== FALSE) {
$stripped = substr($domain,$period+1);
} else {
$stripped = $domain;
}
Хотя поведение изменилось, рейтинг не изменился (большую часть времени). Вот они, время нормализовано до самого быстрого.
- регулярное выражение нескольких субдоменов: 1
- .co.uk регулярное выражение (быстро): 1,01
- .co.uk str (fast): 1.056
- .co.uk регулярное выражение (правильно): 1,1
- .co.uk str (правильно): 1.127
- строковый множественный поддомен: 1,282
- взрыв нескольких поддоменов: 1.305
Здесь разница во времени настолько мала, что для нее не было ничего необычного. Например, быстрое регулярное выражение .co.uk часто побеждает регулярное регулярное выражение множества субдоменов. Таким образом, точная реализация не должна оказывать заметного влияния на скорость. Вместо этого выберите один на основе простоты и ясности. До тех пор, пока вам не нужно обрабатывать домены .co.uk, это будет подход регулярного выражения с несколькими поддоменами.