#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: Совершенно верно. Это то, что я получаю за написание регулярных выражений сразу после пробуждения.