Как сделать группу необязательной в preg_replace? - PullRequest
1 голос
/ 19 декабря 2011

Я пытаюсь заменить: *facebook.com/ на http://graph.facebook.com/

Мне нужно иметь возможность группировать что-либо до части facebook.com в необязательную группу.
Я не могу просто заменить facebook.com на graph.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;
?>

Ответы [ 2 ]

6 голосов
/ 19 декабря 2011

Обращаясь к вашему вопросу конкретно: Вы можете сделать любой отдельный символ (или группу символов) необязательным, добавив ? после него в своем регулярном выражении.

Несколько советов по просмотру вашего кода:

  • Если вы сопоставляете строки, содержащие / символов, упростите свою жизнь, используя другой разделитель (например, #). Вы не обязаны использовать косую черту.
  • Вам следует избегать метасимвола . dot, поскольку он соответствует ЛЮБОМУ одиночному символу, поэтому ваше выражение 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

?>
5 голосов
/ 19 декабря 2011

используйте что-то вроде ниже

(optional-regex-here)?
...