【问题标题】:regex/preg_replace to replace subdomain [closed]regex/preg_replace 替换子域 [关闭]
【发布时间】:2011-06-15 17:59:13
【问题描述】:

我需要使用 preg_replace 将两个子域元素替换为单个元素。我的正则表达式技能几乎不存在。网址的格式为:

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

需要替换为:

newvalue.domain.org

【问题讨论】:

标签: php regex preg-replace


【解决方案1】:
preg_replace( '/[a-z0-9]+\.common/i' , 'newvalue' , $url );

【讨论】:

  • 这并不能确保只替换 domain.org 值...它作用于字符串中带有 [a-z0-9]+\.common 的任何内容
  • 将“common.domain”替换为“newvalue”。即元素 2 和 3,而不是元素 1 和 2
  • @devy:提供一个例子,因为我不明白。键盘首选
  • @Brian:不,它用 newvalue 替换了 user1.common
  • @yes123:我认为 devy 意味着如果字符串 user1.common 出现在文件中的其他位置,但它不是域(它后面没有 domain.org),你的正则表达式仍然会替换/匹配它。我认为您必须积极向前看,以确保紧随其后的是域关闭(如 domain.org)。
【解决方案2】:

试试这个:

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

【讨论】:

  • 这个答案缺少教育解释。
【解决方案3】:

使用正则表达式可能无法最好地解决此问题。尝试使用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 结尾。

【讨论】:

    【解决方案4】:

    这将起作用:

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

    输出 newvalue.domain.org

    【讨论】:

    • 这个答案缺少教育解释。
    【解决方案5】:

    试试这个代码:

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

    【讨论】:

    • 这个答案缺少教育解释。
    【解决方案6】:

    这样会更简洁:

    对于主机:

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

    用任何字符一次或多次+“.common”+“.domain”替换字符串为“newvalue.domain.org”

    对于网址:

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

    用“http://”或“https://”+任意字符一次或多次+“.common”+“.domain”替换为“http://”或“https”的字符串://" + "newvalue.domain.org"

    【讨论】:

      【解决方案7】:

      这仅适用于您可以确定它以 domain.org 结尾:

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

      【讨论】:

      • 那些.*? 作为否定字符类会更好。
      猜你喜欢
      • 2013-02-24
      • 2023-03-17
      • 2013-12-09
      • 2018-02-27
      • 2014-06-10
      • 2014-01-11
      • 2021-10-01
      • 1970-01-01
      • 2011-01-24
      相关资源
      最近更新 更多