PHP preg_replace делает регулярное выражение необязательным? - PullRequest
3 голосов
/ 14 сентября 2010

У меня есть контент, который я пытаюсь разобрать ...

У меня есть html, и с помощью html я хочу заменить все мои теги img пользовательской строкой. Теперь одна из проблем, с которыми я сталкиваюсь, заключается в том, что появляется некоторое содержимое: теги изображений находятся между якорем.

отл.

<a href="link"><img></a>

Следующий код у меня работает ... но я хочу, чтобы он был необязательным, поэтому, если никакой якорный тег не окружен тегом img, есть ли у кого-нибудь хороший ресурс по регулярному выражению или он может мне помочь?

Спасибо!

$content = preg_replace('#<a.*?>'.$image_tag.'</a>#i', "{$image_id}", $content);

Ответы [ 2 ]

4 голосов
/ 14 сентября 2010
  • Знак вопроса после токена делает этот токен необязательным.
  • Используйте (?...) для группировки нескольких токенов (без создания группы захвата).
  • Сочетая их, (?...)? делает группу необязательной.

Так что вы можете сделать это:

$content = preg_replace('#(?:<a.*?>)?'.$image_tag.'(?:</a>)?#i',
                        "{$image_id}",
                        $content);

Возможно, вы также захотите взглянуть на альтернативные решения, не основанные на регулярных выражениях, например, с использованием анализатора HTML.

2 голосов
/ 14 сентября 2010

Есть ли причина

$content = preg_replace('#'.$image_tag.'#i', "{$image_id}", $content);

не сработает? Если в вашем регулярном выражении нет якорей ^ и $, он должен просто искать $ image_tag в любом месте данных, независимо от того, окружено ли оно тегами . Если это не сработает, возможно, попробуйте:

$content = preg_replace('#(<a.*?>)?'.$image_tag.'(</a>)?#i', "{$image_id}", $content);

, который превращает теги и в подшаблоны, за которыми следует модификатор ? (то есть подшаблон может встречаться 0 или 1 раз)

...