[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Валидация тегов bbcode
Страницы: 1, 2
Forever
Проверка bbcode "параметра" на наличие в массиве.

Скажем, есть текст, в котором имеются теги вида [параметр:значение] (например [hero:Tidehunter] , где Tidehunter - это название героя).

На выходе теги должны давать такой html:
<a href = 'mysite/heroes/tidehunter' ><img src = '/images/tidehunter.jpg'></a>

Также есть массив героев $a.

Подскажите, как проверить, является ли значение в тегах действительно названием героя, то есть имеется в массиве $a, и если не имеется, то вместо

html:
<a href = 'mysite/heroes/tidehunter' ><img src = '/images/tidehunter.jpg'></a>

отдавать просто [hero:Milfhunter]

walerus
Как вариант, регуляркой из ббкода получить имя героя, потом inarray
killer8080
preg_replace_callback
$content = preg_replace_callback($pattern, function($match) use ($available_list) {
...
}, $content);
Forever
Цитата (killer8080 @ 13.04.2018 - 09:44)
preg_replace_callback
$content = preg_replace_callback($pattern, function($match) use ($available_list) {
...
}, $content);

Спасибо, как раз то, что я искал. Хотел спросить заодно -
Это нормальная практика - так валидировать?
Не слишком накладно выходит? Так делают вообще?))

я просто ыпервые сталкиваюсь с бб кодом
AllesKlar
Цитата (Forever @ 13.04.2018 - 09:36)
Это нормальная практика - так валидировать?

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

_____________
[продано копирайтерам]
killer8080
Цитата (Forever @ 13.04.2018 - 10:36)
Это нормальная практика - так валидировать?

ну это как бы не валидация, а преобразования bb-кодов в html
Forever
Цитата (AllesKlar @ 13.04.2018 - 11:50)
Цитата (Forever @ 13.04.2018 - 09:36)
Это нормальная практика - так валидировать?

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

Но кроме как проверять каждое вхождение на наличие в массиве у меня альтернатив нет же? Или есть?)
FatCat
Цитата (AllesKlar @ 13.04.2018 - 10:50)
Регулярные выражения - это очень ресурсоемкий механизм и их стоит избегать.
Не всегда получается, к сожалению.

stristr+strpos+substr на 2 порядка быстрее и экономичней. Но код уж больно громоздкий получается.

Например, наш форумный тег [more] сначала был написан
регуляркой
$txt = preg_replace( "#\[ more\](.+?)\[/more\]#is", "<!--spoilerstart--><div class='sp-wrap'><div class='sp-head-wrap'><div class='sp-head folded clickable'><b><u>Свернутый текст</u></b></div></div><div class='sp-body'><div class='sp-content'>\\1</div></div></div><!--spoilerstend-->", $txt );
$txt = preg_replace( "#\[ more=(.*?)\](.*?)\[\/more\]#is", "<!--spoilerstart--><div class='sp-wrap'><div class='sp-head-wrap'><div class='sp-head folded clickable'><b><u>\\1</u></b></div></div><div class='sp-body'><div class='sp-content'>\\2</div></div></div><!--spoilerstend-->", $txt );
При попытке загнать под спойлер сотню К текста, сервер вешался.

Пришлось переписать код под
строковые функции
if(stristr($txt,"[ more"))
{
$old_txt = $txt;
while(
stristr($old_txt,"[ more")
and stristr($old_txt,"[ /more]")
and strpos($old_txt,"[ more") !== false
and
strpos($old_txt,"[ /more]") !== false
and
strpos($old_txt,"[ more") < strpos($old_txt,"[ /more]")
)

{
$txt = "";
$txt = substr($old_txt,0,strpos($old_txt,"[more"))."<!--spoilerstart--><div class='sp-wrap'><div class='sp-head-wrap'><div class='sp-head folded clickable'><b><u>";
$old_txt = substr($old_txt,(strpos($old_txt,"[more")+strlen("[more")));
if(substr($old_txt,0,1) == "=")$txt .= substr($old_txt,1,(strpos($old_txt,"]")-1));
else $txt .= "Свернутый текст";
$old_txt = substr($old_txt,(strpos($old_txt,"]")+1));
$txt .= "</u></b></div></div><div class='sp-body'><div class='sp-content'>";

$txt .= substr($old_txt,0,strpos($old_txt,"[ /more]"))."</div></div></div><!--spoilerstend-->";

$old_txt = substr($old_txt,(strpos($old_txt,"[ /more]")+strlen("[ /more]")));
$txt .= $old_txt;
$old_txt = $txt;
}
}
И теперь без проблем принимает мегабайт текста.

_____________
Бесплатному сыру в дырки не заглядывают...
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.