我正在尝试创建一个在倒数第二个点之前删除所有内容的函数。如果字符串类似于www.dev.community.google.com
,那么我想删除google.com
之前的所有内容。
这些子域名并不总是相似,有时它们只是www.google.com
,有时是www.community.google.com
。
所以关键是要删除之前的所有内容,包括倒数第二个点。我怎么能用PHP做到这一点?
答案 0 :(得分:1)
可能有一些不同的解决方案。
最小的一个:
function domain($input)
{
// Split the input string into pieces, use dot (.) as delimiter
$pieces = explode('.', $input);
// Get the last two pieces
$domain = array_slice($pieces, -2);
// Join them back using dot as delimiter and return
return implode('.', $domain);
}
echo(domain('www.dev.community.google.com')."\n");
echo(domain('www.community.google.com')."\n");
echo(domain('community.google.com')."\n");
echo(domain('google.com')."\n");
echo(domain('com')."\n");
输出结果为:
google.com
google.com
google.com
google.com
com
答案 1 :(得分:0)
以下解决方案适用于各种网址:
var headersAreFixed = $q.defer();
function fixHeaderWidths() {
if (!$element.find("thead th .th-inner").length) {
$element.find("thead th").wrapInner('<div class="th-inner"></div>');
}
if($element.find("thead th .th-inner:not(:has(.box))").length) {
$element.find("thead th .th-inner:not(:has(.box))").wrapInner('<div class="box"></div>');
}
$element.find("table th .th-inner:visible").each(function (index, el) {
el = angular.element(el);
var width = el.parent().width(),
lastCol = $element.find("table th:visible:last"),
headerWidth = width;
if (lastCol.css("text-align") !== "center") {
var hasScrollbar = $element.find(".scrollArea").height() < $element.find("table").height();
if (lastCol[0] == el.parent()[0] && hasScrollbar) {
headerWidth += $element.find(".scrollArea").width() - $element.find("tbody tr").width();
headerWidth = Math.max(headerWidth, width);
}
}
var minWidth = _getScale(el.parent().css('min-width')),
title = el.parent().attr("title");
headerWidth = Math.max(minWidth, headerWidth);
el.css("width", headerWidth);
if (!title) {
// ordinary column(not sortableHeader) has box child div element that contained title string.
title = el.find(".title .ng-scope").html() || el.find(".box").html();
}
//el.attr("title", title.trim());
});
headersAreFixed.resolve();
}
输出
google.com
community.com
以下是工作演示link。
答案 2 :(得分:0)
使用regexp
识别并仅保留最后两个组件的另一种解决方案:
function domain($input)
{
return preg_replace('/^.*\.([^.]*\.[^.]*)$/', '\1', $input);
}
正则表达式没什么特别的:
^ # matches the start of the string
.* # anything, any number of times
\. # followed by a dot (need to escape it to get its literal value)
( # followed by a group that contains:
[^.]* # anything but a dot, any number of times
\. # a dot
[^.]* # anything but a dot, any number of times
) # this is where the group closes; it it used to capture its content
$ # the end of the string (nothing else is allowed after the group)
替换字符串(\1
)包含back reference到输入字符串中与regexp
中的第一个组匹配的部分。 regexp
中唯一的一个组与域的最后两个组件匹配,由点连接。
<强>备注强>
如果输入字符串不包含任何点,则它只有一个组件。在这种情况下,regexp
不匹配,preg_replace()
返回未改变的输入字符串(这是我们在这种情况下对它的期望)。
答案 3 :(得分:-1)
只需使用addhttp()
和get_domain()
函数并按照以下方式使用它们:
<?php
print get_domain("www.dev.community.google.com");
function get_domain($url)
{
$url = addhttp($url);
$pieces = parse_url($url);
$domain = isset($pieces['host']) ? $pieces['host'] : '';
if (preg_match('/(?P<domain>[a-z0-9][a-z0-9\-]{1,63}\.[a-z\.]{2,6})$/i', $domain, $regs)) {
return $regs['domain'];
}
return false;
}
function addhttp($url) {
if (!preg_match("~^(?:f|ht)tps?://~i", $url)) {
$url = "http://" . $url;
}
return $url;
}
<强>输出强>
google.com