Есть много способов, вы можете сделать это. Простая замена является самой быстрой, если вы знаете, что всегда хотите удалить «www».
$stripped=str_replace('www.', '', $domain);
Регулярное выражение замены позволяет связать этот матч с начала строки:
$stripped=preg_replace('/^www\./', '', $domain);
Если это всегда первая часть домена, независимо от того, является ли его WWW, вы можете использовать взорваться/взрываться. Хотя это легко читать, это самый неэффективный метод:
$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/зиЬзЬг: 1,982
- взрываются/Implode : 2.472
Вышеприведенные примеры кода всегда разделяют первый компонент домена, поэтому он будет работать отлично в таких областях, как «www.example.com» и «www.example.co.uk», но не «example.com» "или" www.department.example. ком». Если вам нужно обрабатывать домены, которые уже могут быть основным доменом, или иметь несколько поддоменов (например, «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);
Это захватывает последние две части из домена и заменяет полное значение строки с захваченной частью. С несколькими субдоменами все главные части обрываются.
Для работы с ".ru" -как домены, а также переменное количество поддоменов, попробуйте:
$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;
}
}
регулярное выражение n-й 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 ул (быстро): 1,056
- .co.uk регулярное выражение (правильный): 1.1
- .co.uk ул (правильная): 1,127
- множественной подобласти ул: 1,282
- множественной подобласть взрывается: 1,305
Здесь разница между временами настолько мала, что это было необычно для. Быстрое .co.uk regex, например, часто било базовое многократное поддоменное регулярное выражение. Таким образом, точная реализация не должна оказывать заметного влияния на скорость. Вместо этого выберите один на основе простоты и ясности. До тех пор, пока вам не нужно обращаться с доменами .co.uk, это будет подход с множественным поддоменом regex.
Приятно, что вы в бенчмарке! – altermativ