我怎样才能让一个组中的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
?>
答
使用类似下面
(optional-regex-here)?
这效果很好,谢谢你的提示!绝对不知道'#'可以用作分隔符。 – 2011-12-19 18:56:16