Страница поиска и замена некоторых элементов

#php #regex

#php #регулярное выражение

Вопрос:

У меня есть 2 набора тегов на странице, первый

 {tip}tooltip text{/tip}
  

и второе — это

 {tip class="someClass"}tooltip text{/tip}
  

Мне нужно заменить их на

 <span class=„sstooltip”><i>?</i><em>tooltip text</em></span>
  

Я не знаю, как справиться с добавлением нового класса в <span> тег. (Класс всплывающей подсказки всегда присутствует)

Это мое регулярное выражение /{tip.*?(?:class="([a-z] )")?}(.*?){/tip}/ .

Я думаю, мне нужно проверить индексы массива на предмет значения класса, но они разные, в зависимости от версии тега {tip}. Нужны ли мне два регулярных выражения, по одному для каждой версии, или есть какой-то способ извлечь и заменить значение класса?

php-код:

 $regex = "/{tip.*?(?:class="([a-z] )")?}(.*?){/tip}/";
$matches = null;
preg_match_all($regex, $article->text, $matches);

if (is_array($matches)) {
    foreach ($matches as $match) {
        $article->text = preg_replace(
            $regex,
            "<span class=tooltip $1"."><i>?</i><em>"."$2"."</em></span>",
            $article->text
        );
    }
}
  

Комментарии:

1. Пожалуйста, покажите нам код, который у вас есть на данный момент.

Ответ №1:

Вот ваш ответ (я также сделал его немного более надежным):

 {tip(?:s classs*=s*"([a-zA-Zs] )")?}([^{]*){/tip}
  

PCRE (который использует PHP, если память не изменяет) автоматически обнаружит, что первая группа захвата (которая захватывает классы) пуста в первом случае, и просто заменит пустую строку в замене. Второй случай не требует пояснений.

Тогда ваш код замены будет выглядеть следующим образом:

 $article->text = preg_replace(
    '/{tip(?:s classs*=s*"([a-zA-Zs] )")?}([^}]*){/tip}/',
    '<span class="tooltip $1"><i>?</i><em>$2</em></span>',
    $article->text
);
  

Вам не нужно проверять, совпадает ли регулярное выражение заранее — это подразумевается preg_replace , который выполняет сопоставление регулярных выражений, а затем заменяет любой текст, соответствующий шаблону, этим текстом. Если совпадений нет, замена не происходит.

Комментарии:

1. Разве не должно быть { вместо } в группе захвата?

2. @Palo: Совершенно верно. Это то, что я получаю за написание регулярных выражений сразу после пробуждения.