|
|
|
| Здравствуйте.
Вот встала задача сделать простенькую админку для сайта, чтобы владелец мог сам менять контент, незадуряясь HTML. У меня вопрос, зачем закрывают ВВ теги? Чтобы проверить четность, или есть еще подвох? Ведь гораздо проще разобрать строку по одинаковым маркерам. Все равно 99% полбзуются кнопкой вставки тегов. А для админки вообще не вопрос - кривой дизайн, это проблемы владельца сайта.
Или я чего-то важного недопонимаю?
Спасибо. | |
|
|
|
|
|
|
|
для: Николай2357
(02.07.2008 в 00:01)
| | .Вообще-то они могут быть вложены. Как минимум - в теории. | |
|
|
|
|
|
|
|
для: Trianon
(02.07.2008 в 00:05)
| | Я наверное попробую на практике. Нет смысла городить огород из регулярок, чтобы избежать одной ошибки на 1000 вводов. Посмотрю, как получится. В теории начало следующего такого же тега закроет предыдущий, а при форматировании текста большинство тегов вкладываются друг в друга. Жаль будет времени, если не сработает. Может кто-нибудь сталкивался и знает подводные камни? | |
|
|
|
|
|
|
|
для: Николай2357
(02.07.2008 в 00:19)
| | Допустим мне нужно выделить часть текста жирным. Как без закрывающего тега обозначить конец выделения? | |
|
|
|
|
|
|
|
для: Николай2357
(02.07.2008 в 00:19)
| | > подводные камни
при интерпритации второго открывающего тега как закрывающего,
невозможно внутри блока нарисовать открываюший тег , как и закрывающий если в шаблоне что-то типа \[/?TAG\]
а так , только закрывающий проинтерпретирует
вложенность можно использовать для неинтерпритации | |
|
|
|
|
|
|
|
для: exp
(02.07.2008 в 03:54)
| | Да вот, собственно, и времени то не понадобилось много:
<?
//Подготовка
if(isset($_POST['ok'])))
$cont=$_POST['message'];
$cont=stripslashes($cont);
$cont=htmlspecialchars($cont);
// Меняю \n на <br />
$contus=explode("\n",$cont);
$ms=count($contus);
for($i=0; $i<$ms; $i++){
$mesf.=$contus[$i]."<br />";
}
//А вот так выделяется жирным:
$line=explode("[B]",$mesf);
$cl=count($line);
for($i=0; $i<$cl; $i++){
$lin=$line[$i];
if($i%2!=""){$lin="<b>$line[$i]</b>";
if($line[$i]==""){$lin="";
}
}
$lib.=$lin;
}
//А так красным
$line=explode("[RED]",$lib);
$cl=count($line);
for($i=0; $i<$cl; $i++){
$lin=$line[$i];
if($i%2!=""){$lin="<span style=\"color:red\">$line[$i]</span>";
if($line[$i]==""){$lin="";
}
}
$lired.=$lin;
}
//А так картинку можно вставить, только загрузить сначала нужно
$line=explode("[IMGL]",$lired);
$cl=count($line);
for($i=0; $i<$cl; $i++){
$lin=$line[$i];
if($i%2!=""){$lin="<img src=../images/$line[$i] align=left hspace=5px vspace=5px border=0 />";
if($line[$i]==""){$lin="";
}
}
$liimgl.=$lin;
}
?>
|
Я уже около 30-ти тегов попробовал, и заголовки, и линию рисует и даже списки делает.
Пока вроде нормально. Ну если тег не закрыть, он и будет открыт до конца блока, потом все равно закроется. Так ведь это проблемы юзера. Пользуйся кнопкой, всегда будет пара. Если один тег вложить в другой такой же, середина исключается и все. Играюсь, пока вроде все работает, может кто найдет тонкое место, а то сдам заказчику, потом стыдно будет.
ЗЫ. Просто не хочется с регулярками лишний раз связываться, я с ними на Вы пока. | |
|
|
|
|
|
|
|
для: Николай2357
(02.07.2008 в 08:13)
| | > Так ведь это проблемы юзера
При таком отношении к юзерам, я Вас уверяю, проблемы будут Ваши. | |
|
|
|
|
|
|
|
для: BinLaden
(02.07.2008 в 10:55)
| | >При таком отношении к юзерам, я Вас уверяю, проблемы будут Ваши.
Я ведь написал, что это для админки, уж одному человеку я сумею объяснить, что и как.
Мне гораздо важнее сроки и количество используемых тегов, а с регулярками придется долго возиться. | |
|
|
|
|
|
|
|
для: Николай2357
(02.07.2008 в 08:13)
| | На то он и интерфейс, чтобы оградить юзера от всяческих проблем и пояснить где и что юзер сделал не так. | |
|
|
|
|
|
|
|
для: Эй
(02.07.2008 в 12:11)
| | А кроме этого есть еще какие нибудь подвохи? | |
|
|
|
|
|
|
|
для: Николай2357
(02.07.2008 в 12:15)
| |
<?
list($headtime, $time) = explode(chr(32), microtime());
$headtime = ($time + $headtime);
// эмуляция $cont
$cont=str_repeat(
'text[IMGL]picture[IMGL]text
text [RED]redtext[RED] text
text [B]boldtext[B] text
', 1500);
//жирным:
$cont=explode("[B]", nl2br($cont));
$ms=count($cont);
$mesf= '';
for($i=0; $i<$ms; $i++){
if($i&1)$mesf .= $cont[$i];
else $mesf .= '<b>' . $cont[$i] .'</b>';
}
//красным
$cont=explode("[RED]",$mesf);
$ms=count($cont);
$mesf= '';
for($i=0; $i<$ms; $i++){
if($i&1) $mesf .= $cont[$i];
else $mesf .= '<span style="color:red">' . $cont[$i] .'</span>';
}
// картинку
$cont=explode("[IMGL]",$mesf);
$ms=count($cont);
$mesf= '';
for($i=0; $i<$ms; $i++){
if($i&1) $mesf .= $cont[$i];
else $mesf .= '<img src=../images/' . $cont[$i] . ' align=left hspace=5px vspace=5px border=0 />';
}
list($msec, $time) = explode(chr(32), microtime());
echo '<hr/>[_' . round(($time + $msec) - $headtime, 4)
. 's_]' . "\n";
?>
|
<?
list($headtime, $time) = explode(chr(32), microtime());
$headtime = ($time + $headtime);
function bbr($cont, $tag, $start, $end) {
$mesf = '';
$cont = explode("\n",$cont);
for($i = 0; $i < count($cont); $i ++){
if($i&1) $mesf .= $cont[$i];
else $mesf .= $start . $cont[$i] .$end;
}
return $mesf;
}
// эмуляция $cont
$cont=str_repeat(
'text[IMGL]picture[IMGL]text
text [RED]redtext[RED] text
text [B]boldtext[B] text
', 1500);
//жирным:
//красным
//картинку
$cont=bbr(nl2br($cont), '[IMGL]', '<img src=../images/', ' align=left hspace=5px vspace=5px border=0 />');
$cont=bbr($cont, '[RED]', '<span style="color:red">', '</span>');
$cont=bbr($cont, '[B]', '<b>', '</b>');
list($msec, $time) = explode(chr(32), microtime());
echo '<hr/>[_' . round(($time + $msec) - $headtime, 4)
. 's_]' . "\n";
?>
|
и всётаки второе иногда работает быстрее , хоть и говорят что вызов функции "обходится дороже"
прямого написания | |
|
|
|
|
|
|
|
для: exp
(02.07.2008 в 14:12)
| | Так круче, попробую.
А что значит "обходится дороже"? | |
|
|
|