|
|
|
| Сперва проверка, затем сформулирую вопрос.....
проверка перекрещенности тегов | |
|
|
|
|
|
|
|
для: Sfinks
(02.01.2007 в 11:31)
| | Ага! Вижу у Вас эта проблема тоже не учтена! Но Вам проще, у Вас html...
Проблема в том, что в xml-документах, таких как xhtml, wml, rss и пр., на структуру
<b>проверка <i>перекрещенности</b> тегов</i>
| браузер начинает ругаться и выдает ошибку разбора XML!
Вот я и не могу придумать, как этого избежать =(
Кодом
<?php
$text = preg_replace("|\[i\](.*?)\[/i\]|i","<i>\$1</i>",$text);
$text = preg_replace("|\[b\](.*?)\[/b\]|i","<b>\$1</b>",$text);
?>
| тут уже не обойдешься.
У кого-нибудь есть идеи? | |
|
|
|
|
|
|
|
для: Sfinks
(02.01.2007 в 11:39)
| | Не могу понять в какой ситуации может возникнуть такая проблема, даже в HTML недопускаю перекрещенность (по моему мнению всё должно не только работать, но и выглядеть на все сто!), но не все такие педанты как я)))
Нужен алгоритм. Можно попробовать организовать массив-стек открывающих и закрывающих тегов и если закрвающий тег отличен от открывающего автоматически вставлять закрывающий тег откытого на момент проверки тега перед ним. | |
|
|
|
|
|
|
|
для: Sfinks
(02.01.2007 в 11:39)
| | И вообще если пишешь код руками то если не ошибаюсь есть программы которые проверяют текст на наличие вот таких ошибок, а если генерируешь код... скажи наконец в какой ситуации у тебя происходить перекрещенность, а то с ума сойду) | |
|
|
|
|
|
|
|
для: Valick
(02.01.2007 в 12:01)
| | Речь идет не о верстке страниц мною, а о подмене тегов в мессагах посетителей гостевой, форума и т.п. Т.е. о так называемом BB-CODE. Это я знаю, что такое вложенность, ты знаешь, программеры и верстальщики знают.... А также знают всяческие вредители! А простые посетители вполне могут написать так, как я показал в примере.
> Организовать массив-стек открывающих и закрывающих тегов.....
Для этого нужно делать цыкличную посимвольную проверку введенного посетителем текста. Это непозволительно долго! | |
|
|
|
|
|
|
|
для: Valick
(02.01.2007 в 12:01)
| | > скажи наконец в какой ситуации у тебя происходить перекрещенность, а то с ума сойду
Наглядный пример перекрещенности в первом посте этой темы! Если бы этот форум был не HTML, a xHTML, большинство браузеров не отображало бы эту страницу! | |
|
|
|
|
|
|
|
для: Sfinks
(02.01.2007 в 13:25)
| | Я уже и сам догадался, да позновато.... после нового года башка быстро не варит...
Ну а что по поводу моей бредовой идеи? Должно получиться что-то вроде
<b>пример <i>перекрещивающихся </i><b></b>тегов <i></i></b>
а потом или сразу пустые теги можно вообще выкинуть | |
|
|
|
|
|
|
|
для: Sfinks
(02.01.2007 в 11:39)
| | Фух, ёлки! Аж проц дымицо! Но я решил эту задачку =)
Вот, возможно кому-то пригодится:
<?php
function teg_biu($text,$tegs = array("b","i","u")){
if(!is_array($tegs)) $tegs = array($tegs);
foreach($tegs as $teg){
$o_pos = stripos($text,"[".$teg."]");
$c_pos = stripos($text,"[/".$teg."]");
if($o_pos===false && $c_pos===false) continue;
elseif($o_pos===false) { $text = "[".$teg."]".$text; $text = teg_biu($text,$teg); }
elseif($c_pos===false) { $text = $text."[/".$teg."]"; $text = teg_biu($text,$teg); }
elseif($o_pos > $c_pos) { $text = "[".$teg."]".$text; $text = teg_biu($text,$teg); }
else{
$beg = substr($text,0,$o_pos);
$mid = teg_biu(substr($text,$o_pos+3,$c_pos-$o_pos-3));
$end = teg_biu(substr($text,$c_pos+4));
$text = $beg."<".$teg.">".$mid."</".$teg.">".$end;
}
}
return $text;
}
$text = "проверка перекрещенности тегов";
echo teg_biu($text);
?>
|
Результат:
<b>проверка <i>перекрещенности</i></b><i> тегов</i>
|
| |
|
|
|
|
|
|
|
для: Sfinks
(09.01.2007 в 01:21)
| | Такой:
<i><b>text<i>text<b>text</i>text</b>text</i></b>
|
неправильно разведет
P.S. огромная просьба к cheops'у сделайте тег [notag][/notag] :) | |
|
|
|
|
|
|
|
для: Евгений Петров
(09.01.2007 в 02:03)
| | Зачем высказывать голословные утверждения, даже не проверив?
Прекрасно разводит!
Вот результат:
<i><b>text<i>text<b><i>text</i>text</b></i></b><b><i>text</i></b></i>
|
Да, 4 лишних тега... Но главное браузер, не ругается!
А если уж хочется, чтоб и внутри все было красиво, то нет ничего проще, чем написать функцию удаления лишнего...
<?php
function trash($text){
foreach(array("b","i","u") as $teg){
$s = preg_replace("|</".$teg.">([\s]*)<".$teg.">|i","\$1",$text);
if($s !== $text) break;
}
if($s !== $text) $text = trash($s);
return $text;
}
$text = "<i><b>text<i>text<b><i>text</i>text</b></i></b><b><i>text</i></b></i>";
echo trash($text);
?>
|
и вот результат:
<i><b>text<i>text<b><i>text</i>text</b>text</i></b></i>
|
А если речь идет о вложенности повторных тегов, то ето уже проблемы того, кто это писал! Главное, что ето не будет мешать другим и не отрубит гостю или форум.
Можно конечно и это убрать, но, ИМХО, это будет неоправданная трата ресурсов серва, как впрочем и функция trash(). | |
|
|
|
|
|
|
|
для: Sfinks
(09.01.2007 в 02:57)
| | Хотя, если очень хочется, то вот такая функция:
<?php
function duble_tegs($text,$tegs = array("b","i","u"),$del=false){
if(!is_array($tegs)) $tegs = array($tegs);
foreach($tegs as $teg){
$o_pos = stripos($text,"<".$teg.">");
if($o_pos===false) continue;
else{
if(!$del){
$beg = substr($text,0,$o_pos);
$end = duble_tegs(substr($text,$o_pos+3),$teg,true);
$text = $beg."<".$teg.">".$end;
}
else{
$c_pos = stripos($text,"</".$teg.">");
if($c_pos < $o_pos){
$beg = substr($text,0,$o_pos);
$end = duble_tegs(substr($text,$o_pos+3),$teg,true);
$text = $beg."<".$teg.">".$end;
}
else{
$text = preg_replace("|<".$teg.">(.*?)</".$teg.">|i","\$1",$text,1);
$text = duble_tegs($text,$teg,true);
}
}
}
}
return $text;
}
echo duble_tegs("<i><b>text<i>text<b><i>text</i>text</b>text</i></b></i>")."\n";
echo duble_tegs("<i>text<i>text</i>text<i>text</i>text</i>")."\n";
echo duble_tegs("<b>text<i><b>text</b></i>text<i>text<i>text</i>text</i>text</b>")."\n";
?>
|
Результат:
<i><b>texttexttexttexttext</b></i>
<i>texttexttexttexttext</i>
<b>text<i>text</i>text<i>texttexttext</i>text</b>
|
Теперь связка duble_tegs(trash_tegs(teg_biu($text))); правильно разберет и оптимизирует любой набор тегов <b>, <i>, <u> =) | |
|
|
|
|
|
|
|
для: Sfinks
(09.01.2007 в 02:57)
| | А, да, прошу прощения. Вчера ночью мне почему то показалось, что второй тег <i> закрытый. | |
|
|
|
|
|
|
|
для: Sfinks
(02.01.2007 в 11:31)
| | Вероятно, ничего лучше, чем парсить код перед добавлением в базу данных и в случае возникновения ошибок сообщать об них пользователю не придумаешь. Я так понимаю тэгов будет вагон и маленькая тележка? | |
|
|
|
|
|
|
|
для: cheops
(02.01.2007 в 13:59)
| | А если не вагон, есть варианты контроля чеез рег.выр.?
Скажем [b] [u] [i] [url] [img] [mail] и все.... | |
|
|
|