Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Перевод BB -> HTML с произвольными аттрибутами
 
 автор: stalk3r   (13.01.2009 в 23:57)   письмо автору
 
 

Приветствую всех, собственно давно уже стоит загвоздка в написании регулярки для перевода 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);

  Ответить  
 
 автор: stalk3r   (14.01.2009 в 04:20)   письмо автору
 
   для: xx7   (14.01.2009 в 02:59)
 

Жесть))
В общем-то решение было найдено, теперь вопрос такой
Заменить все кавычки на html сущность везде кроме html-тегов
Т.е.
<a href="link">"Title"</a>
Должно замениться на
<a href="link">&quot;Title&quot;</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-странице

  Ответить  
 
 автор: stalk3r   (25.01.2009 в 22:11)   письмо автору
 
   для: xx7   (14.01.2009 в 23:10)
 

Началось все с того, что мне надо было сделать функцию очищающую HTML, оставляя теги с нужными аттрибутами (которые могут стоять в разном порядке и которых может не быть)
Для этого я сначала делал htmlspecialchars(), затем восстанавливал скобки разрешенных тегов.
Например:
<a href="somelink" target="_blank">Разрешено</a><script>alert("Опасно!");</script>

С разрешенным тегом a и аттрибутами href и target после "чистки" и восстановления нужных скобок получается
<a href=&quot;somelink&quot; target=&quot;_blank&quot;>Разрешено</a>&gt;script&lt;alert(&quot;Опасно!&quot;);&gt;/script&lt;

И теперь в <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('&amp;', '........
(или htmlspecialchars() c флагом ENT_NOQUOTES), перед преобразованием [a ..... ]
кавычки и апострофы могут только навредить если данные помещаются внутрь тега
, например выводятся в теге <input> а так никакого вреда не будет если оставить их как есть

  Ответить  
 
 автор: spider-x   (27.01.2009 в 18:52)   письмо автору
 
   для: stalk3r   (25.01.2009 в 22:11)
 

Проще воспользоваться готовым классом... ибо всёравно будет много ошибок и недоработак... а люди создающие подобные классы занимаются только классами а не целыми CMS системами... мой выбор пал на xBB... Попробуйте... может так будет проще?

  Ответить  
 
 автор: stalk3r   (28.01.2009 в 23:57)   письмо автору
 
   для: spider-x   (27.01.2009 в 18:52)
 

Хотелось написать одну свою понятную функцию, а не коннектить тысячу файлов с целыми классами.
Посмотрел хББ, то о чем я и думал - конечные автоматы, т.е. синтактический анализ. Собственно то, к чему я и шел

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования