在特定逻辑上转换字符串

时间:2014-03-03 23:26:58

标签: php

我想将特定链接转移到另一个。模式看起来像这样:

http://domain.com/sub/code/namehttp://a.domain.com/subs/code/name

我在域名前需要a个字母前缀,sub将是复数subs,所有其他内容都需要相等。

当然,该链接可以从http://wwwhttp://www

开始

substr_replacestrposexplode的混合,我在这项任务上停留了1个多小时,决定问它。

3 个答案:

答案 0 :(得分:1)

尝试这样的事情:

/^((?:http://)|(?:http://www\.)|(?:www\.))(\w+)(\.\w+\/)([\w+_\-]+)(\/.*?)$/

#$1YOUR_STRING.$2$3SOMETHING_ELSE$5

RegExr示例:http://regexr.com?38dn0

答案 1 :(得分:1)

你所要求的是相当含糊的,所以我认为“转移”你的意思是“替换为”。如果是这种情况,那么你应该研究正则表达式(或正则表达式)。

正则表达式相对普遍,因此当您学习它们一次时,您可以将它们应用于大多数语言。

在PHP中,您可以使用preg_replace执行正则表达式替换,但可能有助于首先读取模式的不同元素。

相关链接:

preg_replace PHP Function

PCRE Regex Syntax

编辑:您所使用的最终结果仍然可以使用您所描述的strposexplode等来实现,但正则表达式可能会让您更快地到达目的地。

答案 2 :(得分:0)

试试这个:

<?php
function convertLink($str)
{
    //ensure a scheme exists
    if(strpos($str,'http://')===false&&strpos($str,'https://')===false)
    {
        $str='http://'.$str;
    }
    $parts=parse_url($str);
    $scheme=$parts['scheme'];
    $domain=$parts['host'];
    $path=array_key_exists('path',$parts)?$parts['path']:'';
    $query=array_key_exists('query',$parts)?('?'.$parts['query']):'';
    $fragment=array_key_exists('fragment',$parts)?('#'.$parts['fragment']):'';

    if(strpos($parts['host'],'www.')===0){$domain=substr($parts['host'],4);}
    if(array_key_exists('port',$parts)){$domain.=':'.$parts['port'];}
    if(strpos($path,'/sub/')===0){$path='/subs/'.substr($path,5);}
    return "{$scheme}://a.{$domain}{$path}{$query}{$fragment}";
}

$links=array();
$links[]='domain.com/sub/code/name';
$links[]='domain.com:20/sub/code/name';
$links[]='www.domain.com/sub/code/name';
$links[]='http://domain.com/sub/code/name';
$links[]='http://www.domain.com/sub/code/name';
$links[]='https://domain.com/sub/code/name';
$links[]='sub.domain.com/sub/code/name';
$links[]='domain.com/sub/code/name?a=1&b=2#c';

echo '<pre>';
foreach($links as $link)
{
    echo str_pad($link, 40,' ',STR_PAD_RIGHT).'=> '.convertLink($link)."\n";
}
echo '</pre>';

输出:

domain.com/sub/code/name                => http://a.domain.com/subs/code/name
domain.com:20/sub/code/name             => http://a.domain.com:20/subs/code/name
www.domain.com/sub/code/name            => http://a.domain.com/subs/code/name
http://domain.com/sub/code/name         => http://a.domain.com/subs/code/name
http://www.domain.com/sub/code/name     => http://a.domain.com/subs/code/name
https://domain.com/sub/code/name        => https://a.domain.com/subs/code/name
sub.domain.com/sub/code/name            => http://a.sub.domain.com/subs/code/name
domain.com/sub/code/name?a=1&b=2#c      => http://a.domain.com/subs/code/name?a=1&b=2#c