如何在preg_replace中创建一个组可选?

时间:2011-12-19 17:46:59

标签: php regex string url preg-replace

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

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

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

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

2 个答案:

答案 0 :(得分:6)

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

查看代码时的一些提示:

  • 如果您要匹配包含/个字符的字符串,请使用其他分隔符(例如#)来简化您的生活。您不需要使用正斜杠。
  • 你应该逃避.点元字符,因为它匹配任何单个字符,因此你的表达式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

?>

答案 1 :(得分:5)

使用类似下面的内容

(optional-regex-here)?