【问题标题】:How can I make a group optional in preg_replace?如何在 preg_replace 中使组可选?
【发布时间】:2011-12-19 17:46:58
【问题描述】:

我正在尝试替换: *facebook.com/ http://graph.facebook.com/

我需要能够将facebook.com 部分之前的任何内容分组到可选组中。
我不能只用graph.facebook.com 替换facebook.com,因为传入的URL 可能包含https

这是我所拥有的,但错过了没有 http[s]:// 的任何内容。

<?php
$fb_url = preg_replace('/http[s]*:\/\/[www.]*facebook.com\//', 'http://graph.facebook.com/', 'facebook.com/some/segments');
echo $fb_url;
?>

【问题讨论】:

    标签: php regex string url preg-replace


    【解决方案1】:

    具体解决您的问题: 您可以通过在正则表达式中添加? 来使任何单个字符(或一组字符)成为可选字符。

    查看您的代码的一些提示:

    • 如果您要匹配包含/ 字符的字符串,请使用不同的分隔符(例如#)来简化您的工作。您不需要使用正斜杠。
    • 您应该转义 . 点元字符,因为它匹配任何单个字符,因此您的表达式 www. 可以想象匹配 www9 或类似的任何其他内容
    • 另外,括号[...] 用于匹配一系列字符。如果您想专门匹配文本 www.,您应该使用像 (?:www\.) 这样的非捕获组,并通过在其后添加 ? 使其成为可选组,如 (?:www\.)?

    所以,记住这些提示,试试...

    <?php
    
    $p = '#(?:https?://(?:www\.)?)?facebook\.com/#';
    $r = 'http://graph.facebook.com/';
    $subject = 'facebook.com/some/segments';
    
    $fb_url = preg_replace($p, $r, $subject);
    echo $fb_url; // outputs: http://graph.facebook.com/some/segments
    
    ?>
    

    【讨论】:

    • 这很好用,感谢您的提示!绝对不知道#可以用作分隔符。
    【解决方案2】:

    使用类似下面的东西

    (optional-regex-here)?
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-11
      • 1970-01-01
      • 1970-01-01
      • 2010-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多