替换可选子域

时间:2016-07-19 00:06:34

标签: php regex

我正在使用preg_replace进行一些后处理并在特定链接上查看链接是否有子域名,如果有,请替换它,如果没有,请添加特定的子域名。我的正则表达式如果它不存在,则当前添加子域,但如果它确实存在,则将其添加两次。

期望的结果示例

输入:http://somesubdomain.example.com/ 输出:http://newsubdomain.example.com/

输入:http://example.com/ 输出http://newsubdomain.example.com/

我目前使用的是:

preg_replace('/(?:.)example\.com\/game\/([a-zA-Z0-9-_,.]+)/','specialsubdomain.example.com/game/$1', $output);

因此,如果有子域,请替换它,如果没有 - 插入它。

非常感谢。

2 个答案:

答案 0 :(得分:1)

描述非捕获组中的最终子域并将其设为可选:

$pattern = '~(?:[^/]*\.)?(example\.com/game/[\w,.-]+)~';
$result = preg_replace($pattern, 'specialsubdomain.$1', $output);

答案 1 :(得分:0)

您可以采用Conditional Logicpreg_splitimplode的组合方式,如下面的代码所示。逻辑被封装在function中以便重新使用。

        <?php

        function replaceDomainName($mainDomain, $subDomainName){
            $arrMainDomainSplit = preg_split("#\.#i", $mainDomain);
            $arrHTTPParts       = array();
            $strNewSubDomain    = "";

            if(preg_match("#:\/\/#", $arrMainDomainSplit[0])){
                $arrHTTPParts   = preg_split("#:\/\/#i",  $arrMainDomainSplit[0]);
            }
            if(count($arrMainDomainSplit)>2){
                if(!empty($arrHTTPParts)){
                    array_splice($arrMainDomainSplit, 0, 1);
                    $strNewSubDomain .= $arrHTTPParts[0] . "://{$subDomainName}." . implode(".", $arrMainDomainSplit);
                }
            }else if(count($arrMainDomainSplit)<=2){
                array_splice($arrMainDomainSplit, 0, 1);
                $strNewSubDomain .= $arrHTTPParts[0] . "://{$subDomainName}.{$arrHTTPParts[1]}." . implode(".", $arrMainDomainSplit);

            }
            return $strNewSubDomain;
        }

        $mainDomain1    = "http://somesubdomain.example.com/";
        $mainDomain2    = "http://example.com/";

        $subDomain1     = replaceDomainName($mainDomain1, "newsubdomain");
        $subDomain2     = replaceDomainName($mainDomain2, "newsubdomain");

        var_dump($subDomain1);  //<== YIELDS:: http://newsubdomain.example.com/
        var_dump($subDomain2);  //<== YIELDS:: http://newsubdomain.example.com/

测试here

干杯和好运......