|
|
|
| Приветствую всех, собственно давно уже стоит загвоздка в написании регулярки для перевода BBCodes в HTML
Проблема в том, что bb (как и html-теги) может содержать в себе атрибуты. Так вот нужно написать универсальную регулярку, которая бы распознавала тег с этими атрибутами, расположенными в произвольном порядке. Кроме того некоторых атрибутов может не быть
Приведу пример, путь есть разрешенный тег <a> с разрешенными атрибутами href, title, target
Т.е. регулярка должна распознавать все следующие bb-коды:
[a href="" title="" target=""][/a]
[a target="" href="" title=""][/a]
[a href=""][/a]
[a title="" target=""][/a]
|
и переводить их соответственно в
<a href="" title="" target=""></a>
<a target="" href="" title=""></a>
<a href=""></a>
<a title="" target=""></a>
|
Мне непонятно, как можно разрешить произвольный порядок аттрибутов (и их разное количество) | |
|
|
|
|
автор: xx7 (14.01.2009 в 02:59) |
|
|
для: stalk3r
(13.01.2009 в 23:57)
| | как-нибудь можно , но только как-нибудь криво
<?
$txt = '[a href="" title="" target=""][/a]
[a target="" href="" title=""][/a]
[a href=""][/a]
[a title="" target=""][/a]
[a ][/a]
[a href="" onclick=""][/a]
';
$reg1='#\[a\s(?:\s*(?:t(?:itle|arget)|href)="[^"]*")+\s*\]([^\[]*)\[/a\]#';
$reg2='#\[a\s(?:\s*(?:[th](?(?<=t)(?:itle|arget)|ref)="[^"]*"))+\s*\]([^\[]*)\[/a\]#';
$reg3=
'#\[a\s(?:\s*(?:target|title|href)="[^"]*")+\s*\]([^\[]*)\[/a\]#';
preg_match_all($reg1, $txt, $out);
print_r($out);
preg_match_all($reg2, $txt, $out);
print_r($out);
preg_match_all($reg3, $txt, $out);
print_r($out);
|
| |
|
|
|
|
|
|
|
для: xx7
(14.01.2009 в 02:59)
| | Жесть))
В общем-то решение было найдено, теперь вопрос такой
Заменить все кавычки на html сущность везде кроме html-тегов
Т.е.
<a href="link">"Title"</a>
Должно замениться на
<a href="link">"Title"</a> | |
|
|
|
|
автор: xx7 (14.01.2009 в 23:10) |
|
|
для: stalk3r
(14.01.2009 в 04:20)
| | Тоже не очень быстродействующе , что-то типа такого например
<?
header('content-type:text/plain');
$txt = '<a style="a"> "aa"
<b style="b">\' "bb"
<code style="c"> "cc"
</code></b>
[a target=""""][\a]</a>
';
function quo2quo($match){
return (isset($match[1])) ? $match[0]
: str_replace(array('"', "'"), array('_quote_','_drugoe_'), $match[0]);
}
$reg='#(?:(<)[^>]*>\s*)+|[^<]+#';
print preg_replace_callback($reg, 'quo2quo', $txt);
?>
| Но не понимаю зачем изменять кавычки
Не внутри угловатых скобок они так будут на своём месте , и вроде должны не портить валидность даже если текст с кавычками на xhtml-странице | |
|
|
|
|
|
|
|
для: xx7
(14.01.2009 в 23:10)
| | Началось все с того, что мне надо было сделать функцию очищающую HTML, оставляя теги с нужными аттрибутами (которые могут стоять в разном порядке и которых может не быть)
Для этого я сначала делал htmlspecialchars(), затем восстанавливал скобки разрешенных тегов.
Например:
<a href="somelink" target="_blank">Разрешено</a><script>alert("Опасно!");</script>
|
С разрешенным тегом a и аттрибутами href и target после "чистки" и восстановления нужных скобок получается
<a href="somelink" target="_blank">Разрешено</a>>script<alert("Опасно!");>/script<
|
И теперь в <a> нужно вернуть кавычки обратно
Я понимаю, что это решение через ж, и гораздо проще было бы сделать так, как я написал в 1м посте, т.е. уже в preg_replace() сделать "восстановление" вместе с кавычками, но тогда получается вложенные скобки: в паттерне скобки, где находится значение html-атрибуте между кавычек, включены в скобки, которые группируют весь (аттрибут="значение") и указывают что его может не быть знаком вопроса. И в замене уже не указать \\1, \\2, \\3 и тд, тк заранее неизвестно количество атрибутов.
Извиняюсь если запутал) | |
|
|
|
|
автор: xx7 (26.01.2009 в 22:54) |
|
|
для: stalk3r
(25.01.2009 в 22:11)
| | Обычно не должно получаться такой задачи
Если, как понимаю, обрабатывается текст введённый пользователем,
то просто делается например преобразование такого [a href=http target=_blank] без всяких кавычек.
,или есть вариант вместо htmlspecialchars()
применить просто str_replace(array('&', '<', '>'), array('&', '........
(или htmlspecialchars() c флагом ENT_NOQUOTES), перед преобразованием [a ..... ]
кавычки и апострофы могут только навредить если данные помещаются внутрь тега
, например выводятся в теге <input> а так никакого вреда не будет если оставить их как есть | |
|
|
|
|
|
|
|
для: stalk3r
(25.01.2009 в 22:11)
| | Проще воспользоваться готовым классом... ибо всёравно будет много ошибок и недоработак... а люди создающие подобные классы занимаются только классами а не целыми CMS системами... мой выбор пал на xBB... Попробуйте... может так будет проще? | |
|
|
|
|
|
|
|
для: spider-x
(27.01.2009 в 18:52)
| | Хотелось написать одну свою понятную функцию, а не коннектить тысячу файлов с целыми классами.
Посмотрел хББ, то о чем я и думал - конечные автоматы, т.е. синтактический анализ. Собственно то, к чему я и шел | |
|
|
|