Countach
Countach

Reputation: 607

Replace optional subdomain

I am doing some post-processing and on a specific link using preg_replace to see if a link has a subdomain and if it does, replace it and if it does not - add a specific subdomain in. My regex currently adds the subdomain in if it does not exist however if it does exist already it add's it twice.

Desired result examples

Input: http://somesubdomain.example.com/ Output: http://newsubdomain.example.com/

Input: http://example.com/ Output http://newsubdomain.example.com/

What I am currently using:

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

So if there is a subdomain, replace it, if there is not - insert it.

Thanks a lot.

Upvotes: 0

Views: 132

Answers (2)

Poiz
Poiz

Reputation: 7617

One way you could do that is with a combination of Conditional Logic, preg_split and implode as illustrated in code below. The Logic was encapsulated in a function for re-usability.

        <?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/

Test it out here.

Cheers and Good Luck...

Upvotes: 0

Casimir et Hippolyte
Casimir et Hippolyte

Reputation: 89557

Describe the eventual subdomain in a non-capturing group and make it optional:

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

Upvotes: 1

Related Questions