正则表达式/ preg_replace 替换子域名

7

我需要使用 preg_replace 来将两个子域元素替换为一个元素。我的正则表达式技能几乎为零。URL 的格式如下:

user1.common.domain.org
user2.common.domain.org
something.common.domain.org
else.common.domain.org

需要替换为:

newvalue.domain.org

1
请查看 http://meta.stackexchange.com/q/66377/164291。 - user212218
这是一个定义不清的[mcve]。有很多方法可以产生这种输出,但逻辑要求缺乏明确性。研究人员不应该需要阅读已接受的答案才能理解问题。我们不知道'/ [^。]+ \。[^。]+ /',$newvalue是否足够。 - mickmackusa
7个回答

3
preg_replace( '/[a-z0-9]+\.common/i' , 'newvalue' , $url );

1
这并不保证只有 domain.org 值被替换...它会作用于字符串中任何 [a-z0-9]+.common。 - devyndraen
即用“newvalue”替换“common.domain”。即将元素2和3替换为元素1和2。 - lcdservices
@devy:请提供一个示例,因为我不明白你的意思。最好使用Codepad。 - dynamic
1
@Brian:不,它会用新值替换user1.common。 - dynamic
@yes123:我认为devy的意思是,如果字符串user1.common在文件中的其他位置出现,但它不是一个域名(它后面没有跟随domain.org),你的正则表达式仍然会替换/匹配它。我认为你需要使用正向先行断言来确保其后面的内容是域名结尾(如domain.org)。 - yarian
显示剩余4条评论

1

这个问题可能不适合使用正则表达式来解决。尝试使用explode()函数:

$exploded = explode('.', $hostname);
if( (count($exploded) == 4) and ($exploded[1] == 'common') )
{
    $exploded[0] = 'newvalue';
    unset($exploded[1]);
}

$hostname = implode('.', $exploded);

(其中$hostname是您正在检查的主机名[例如,$_SERVER['HTTP_HOST']])

上述代码假定您正在寻找与模式*.common.domain.org匹配的主机名,并且主机名将始终以domain.org结尾。


1

试试这个:

preg_replace("/.+?(domain.+?)/", "newvalue.$1", "user1.common.domain.org");

这个答案缺少教育性的解释。 - mickmackusa

1

这个会起作用:

$sd = "user1.common.domain.org";

$sd = preg_replace('/.*?\.common\.(domain\.org)/i', 'newvalue.$1', $sd);

echo $sd ;

输出 newvalue.domain.org


这个答案缺少教育性的解释。 - mickmackusa

0

试试这段代码:

preg_replace('/\w+\.\w+(?=\.\w+\.\w+)/i', 'newvalue', 'user1.common.domain.org');

这个答案缺少教育性的解释。 - mickmackusa

0

这样更简洁:

对于主机:

$newValue = 'newvalue';
$newHost = preg_replace("/^.+(?:\.common)(\.domain\.org)$/", "$newValue$1", $host);

将以任意字符一次或多次开头的字符串 + ".common" + ".domain" 替换为 "newvalue.domain.org"

对于 URL:

$newValue = 'newvalue';
$newUrl = preg_replace("/^(https?:\/\/).+(?:\.common)(\.domain\.org)$/", "$1$newValue$2", $url);

将以 "http://" 或 "https://" 开头,后跟一个或多个任意字符,接着是 ".common" 和 ".domain" 的字符串替换为 "http://" 或 "https://" 加上 "newvalue.domain.org"


-1

只有当您确定它以 domain.org 结尾时,才能使用此选项:

preg_replace('/(?:.*?)\.(?:.*?)(\.domain\.org)/', $new_val."$1", $url);

那些 .*? 最好改为否定字符类。 - mickmackusa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接