нужно сделать портал!

[Удален]
#161
silicoid:

$input = '[li class="menu-123"][a href="/kontakt" title="Контакт"]Контакт[/a][/li][ba]каля маля[/ba] jjjjjjj [bb]каля-------маля[/bb]';
print preg_replace('/\[(\w{1,3})(\]|.*\])(.*)\[\/\\1\]/imU', '$3', $input);


регулярка получилась достаточно универсальной. то-есть если ее слегка доработать, то она вполне подойдет для перепила BB кодов в HTML даже с учетом рекурсии

с вас 30 евро

Не работает:

<?php

$input = '[li class="menu-123"][a href="/kontakt" title="Контакт"]Контакт[/a][/li]

[bahhhhhh]каля маля[/bahhhhhh] jjjjjjj [bb]каля-------маля[/bb]';

print preg_replace('/\[(\w{1,3})(\]|.*\])(.*)\[\/\\1\]/imU', '$3', $input);

Вы правда не понимаете условие задачи? Внутри [] может быть хоть что.

И вы её решаете не тем способом. А не тем способом решаете потому - что не знаете правильный. ибо он - следует из условия.

И мало того, исписан во всех примерах по 20 раз

Aisamiery
На сайте с 12.04.2015
Offline
319
#162
miltorg:
Не работает

Тогда мне 30 евро — код


$input = '[li class="menu-123"][a href="/kontakt" title="Контакт"]Контакт[/a][/li]
[ba]каля маля[/ba] jjjjjjj [bb]каля-------маля[/bb]';

echo preg_replace('%\[(?!a|/a).*\]%imU', '', $input);
Разработка проектов на Symfony, Laravel, 1C-Bitrix, UMI.CMS, OctoberCMS
melkozaur
На сайте с 06.04.2010
Offline
536
#163

Чет я ржу немножко с этих понятий: адаптация и создание с нуля.

С нуля за 120К вам никто не сделает. То есть я хочу сказать, никто не сделает рабочий портал, который будет работать. За 120К вам сделают очевидную дрянь, а потом все это растянется на пару лет: переписка с "командой" разработчиков, допиливание, которое вообще-то будет означать, что по сути вам ничего не сделали.

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

mendel
На сайте с 06.03.2008
Offline
232
#164
miltorg:
И вы её решаете не тем способом.

Конечно не тем.

Нормальные пацаны делают что-то типа:


$html = '<b>Simple and short';
$purifier = new HTMLPurifier($config);
$pure_html = $purifier->purify($html);

Что решит целую пачку задач. И безопасность, и очистка, и правка ляпов в коде.

Шутку любишь над Фомой, так люби и над собой. (с) народ. Бесплатные списки читабельных(!) свободных доменов (http://burzhu.net/showthread.php?t=2976) (5L.com) Сайты, All inclusive. 5* (/ru/forum/962215)
Lord Maverik
На сайте с 15.04.2003
Offline
471
#165
mendel:
Нормальные пацаны делают что-то типа:

Нормальные это какие? Которые для сайта из 2-х статичных страниц Битрикс поставят?

RedMall.Ru (https://redmall.ru) - Товары из Китая (Таобао, Tmall) с проверкой качества, скидка для форумчан 7% Партнерская программа 2 уровня: 5% + 5%. Подробнее. (https://redmall.ru/about/partner/)
mendel
На сайте с 06.03.2008
Offline
232
#166
Lord Maverik:
Нормальные это какие? Которые для сайта из 2-х статичных страниц Битрикс поставят?

Я не знаю что там в битриксе под капотом.

Но возможно и так.

Для статейника/визитки/лендинга необходимости в жесткой фильтрации нет. Админу можно доверять. Это нужно для пользовательского ввода типа постов/комментариев.

Пурифаер действительно тяжеловат, но "правильные пацаны" не занимаются нанооптимизацией, и в 99% случаев он не является узким местом, поскольку процент записей против чтения очень маленький (обычно).

[Удален]
#167
mendel:
Конечно не тем.
Нормальные пацаны делают что-то типа:

$html = '<b>Simple and short';
$purifier = new HTMLPurifier($config);
$pure_html = $purifier->purify($html);

Что решит целую пачку задач. И безопасность, и очистка, и правка ляпов в коде.

Нормальные пацаны всё уже решили давно в теме:

/ru/forum/comment/14931686

mendel
На сайте с 06.03.2008
Offline
232
#168
miltorg:
Нормальные пацаны всё уже решили давно в теме:

Решили что? Задачку от Милторга? А за нее платят?)

Платят за то, чтобы очистить пользовательский ввод от потенциально опасных конструкций и кода который может испортить оформление оставив как можно больше оформления без искажений. Это задача да. За нее платят, да.

Давно не игрался, всё давно настроено, но на глаз вроде нормальный набор тегов это полтора-два десятка тегов и еще столько же атрибутов, да не всяких, а только у своих тегов. Плюс закрывающие теги. Плюс фильтрация значений атрибутов чтобы не было всяких javascript: в ссылках и прочих прелестей.

Писать ТАКОЕ на регулярках? Серьезно?) А в следующем проекте нужен будет чуть другой набор тегов. Допиливать? Или настройки вынесем?)

Ну и вишенкой - регуляркой не востановить недостающие закрывающие теги во всех контекстах. В принципе не решаемая задача поскольку регулярки не тьюринг-полные.

Задача решается или установкой готового пакета (5 минут, если во фреймворке его еще нет) и при необходимости (обычно не надо) настройки его под свою специфику (еще 5-7минут). Или если хочется поиграться или задача специфическая, то от одного дня до недели (в зависимости от конкретной задачи, неделя если надо настройки, тесты и все такое) на написание своей библиотеки.

И нет, здесь не будет регулярок. Лично я бы наверное писал на основе SimpleXMLIterator. Это наиболее подходящий инструмент, по крайней мере мне так кажется сходу.

S
На сайте с 13.10.2014
Offline
171
#169

Кстати. на счет портала.

я тут на основе регулярки, выше, накидал вот такую штуку

рекурсивный перебор ББ кодов

разрешенные бб-коды описаны массивом в getTagsInfo

replace_recursive($input, $clean) - собсно функция замещения

$input - string - с ббкодами

$clean - boolean - флаг финальной зачистки;


$input = '[span class="menu-123"][a href="/kontakt" title="Контакт"]Контакт[/a][/span]
каля маля jjjjjjj [bbfgdfggfd]каля-------маля[/bbfgdfggfd]
[xc]довыпил[/bd]';


function getTagsInfo()
{
return array(
//<b>
'b' => array(
'replace' => 'b',
'use_html' => TRUE,
'allow_mod' => FALSE,
),

//<a>
'a' => array(
'replace' => 'a',
'use_html' => TRUE,
'allow_mod' => TRUE,
),

//<span>
'span' => array(
'replace' => 'span',
'use_html' => TRUE,
'allow_mod' => TRUE,
),
);
}


function callBack($matches)
{
$tags = getTagsInfo();
$mod = '';

/* check for recursive */
$sub_matches = preg_match('/\[(\w+)(.*)\](.*)\[\/\\1\]/imU', $matches[3],$subpatterns);
if($sub_matches > 0)
$matches[3] = replace_recursive($matches[3]);

/* parse */
if (array_key_exists($matches[1],$tags) && !empty($tags[$matches[1]]['use_html']))
{
if (isset($tags[$matches[1]]['allow_mod']) && $tags[$matches[1]]['allow_mod'] === TRUE)
$mod = ' '.trim($matches[2]);

return '<'.$tags[$matches[1]]['replace'].$mod.'>'.$matches[3].'</'.$tags[$matches[1]]['replace'].'>';
}
else
return $matches[3];

}


function replace_recursive($input, $clean=FALSE)
{
$content = preg_replace_callback('/\[(\w+)(.*)\](.*)\[\/\\1\]/imU', 'callBack', $input);

if ($clean)
$content = preg_replace('/\[\/*(\w+)(.*)\]/imU', '', $content);

return $content;
}


print_r (replace_recursive($input, TRUE) );

может кому пригодится

D
На сайте с 31.01.2017
Offline
15
#170
miltorg:
Нормальные пацаны всё уже решили давно в теме:

/ru/forum/comment/14931686

Нормальные пацаны признают за собой ошибки.

Aisamiery:
Тут уже совсем что то монстроузорное получается ))) Пойду в общем работать :)
Да надо было распарсивать теги а не просто их сносить)))

miltorg, но ваше решение вернее и короче на 146% и конечно же покрывает все ситуации.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий