我怎样才能让一个组中的preg_replace可选?

问题描述:

我试图取代: *facebook.com/http://graph.facebook.com/我怎样才能让一个组中的preg_replace可选?

我需要能够在facebook.com部分之前类的话为可选组。
我不能只是graph.facebook.com取代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; 
?> 

专门解决你的问题: 你可以在你的正则表达式增加后,一个?作任何单个字符(或一组字符)可选。

从看你的代码的一些提示:

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

?> 
+0

这效果很好,谢谢你的提示!绝对不知道'#'可以用作分隔符。 – 2011-12-19 18:56:16

使用类似下面

(optional-regex-here)?