HTML вместо BB

peroon13

Новичок
Нет, нашел решение сам.
Вся проблема была в методе $doc->loadHTML()
Бралась строка в какой-то левой кодировке.

Чтобы строка бралась в нужно кодировке, нужно тиди скормить хтмл с явно указанной кодировкой в виде мета-тега.

Т.е. перед всеми манипуляциями со строкой делаем следующее

$data = '<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/></head>' . $data;

Т.о. тиди сформирует корректный хтмл с мета-тегом, а $doc->loadHTML() в свою очередь поймет какую кодировку ему подсовывают.

Убил на поиск решения целый день :(
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Автор оригинала: tashkentchi
код: <em>text1 <p>text2
стал: <em>text1 <p>text2</p></em>
Может, я думаю, как программист, но по моему мнению, именно так его понимает браузер, т.е. преобразование корректно.

хтмл: <table></table><tr></tr>

конвертится в:

<table><tr><td/>
</tr></table>
А вот почему это правильно, я не понимаю.

<em>text1 <p>text2

конвертится в:

<em>text1</em>
<p><em>text2</em></p>

Так лучше.
А чем именно это лучше?

По основной теме - я делал много лет назад систему блогов, там я сделал возможность писать html на страницах, сделал проверку тегов и аттрибутов.
Ничего особо сложного или опасного не было.
 

WP

^_^
Если нужно быстро очистить код от ненужных html-сущностей.
Сорри за много букав, но это в тему:
PHP:
class SecureHTML
{
 public function _secure_html($text)
 {
  $text = preg_replace_callback($expr = '~'.$this->_html_expr('\w+').'~si',array($this,'_secure_html_callback'),$text);
  return $text;
 }
 public function _prepare_val($string)
 {
  return html_entity_decode($string,ENT_QUOTES,'UTF-8');
 }
 public function _xml_parse_attrs($string)
 {
  preg_match_all('~([^\s=]+)=(?:([\'"])(.*?)\2|([^\s>]+))~si',$string,$mm,PREG_SET_ORDER);
  $attrs = array();
  for ($j = 0,$ss = sizeof($mm); $j < $ss; ++$j)
  {
   $attrs[strtolower($mm[$j][1])] = $this->_prepare_val((isset($mm[$j][4]) and $mm[$j][4] !== '')?$mm[$j][4]:$mm[$j][3]);
  }
  return $attrs;
 }
 public function _html_expr($name_expr = '\w+',$short = FALSE)
 {
  return '<('.$name_expr.')(?:\s+((?:[^>\'"]*(?:([\'"]).*?\3)?)*))?\s*'.($short?'>':'(?:(?<=/)>|>(?:((?:(?R)|.)*?)</\1>)?)');
 }
 public function _secure_html_callback($m)
 {
  static $allowed_tags = array(
   'html','body','a','table','td','tr','b','i','u','s','strike','p','img','div','span','head'
  );
  static $strip_blocks = NULL;
  if ($strip_blocks == NULL) {$strip_blocks = explode('|','script|applet|embed|style|iframe|object|frameset|frame|noscript|select|noindex|title');}
  static $allowed_params = array(
   'src','alt','title'
  );
  $name = strtolower($m[1]);
  $params = isset($m[2])?$this->_xml_parse_attrs($m[2]):array();
  $content = isset($m[4])?$this->_secure_html($m[4]):NULL;
  if (!in_array($name,$allowed_tags))
  {
   if (in_array($name,$strip_blocks)) {return '';}
   else {return $content;}
  }  
  $str = '<'.$name;
  foreach ($params as $k => $v)
  {
   if (!in_array($k,$allowed_params)) {continue;}
   $str .= ' '.$k.'="'.htmlspecialchars($v).'"';
  }
  $str .= ($content === NULL)?' />':'>'.$content.'</'.$name.'>';
  return $str;
 }
}
 

dark-demon

d(^-^)b
а это из разряда "надо что-то исправить - пиши заново" :)

-~{}~ 23.11.07 09:41:

я тут у тебя не заметил защиту от xss. плохо смотрел?
 

WP

^_^
dark-demon
> а это из разряда "надо что-то исправить - пиши заново"
:) подымай скил
> я тут у тебя не заметил защиту от xss. плохо смотрел?
да.
 

kruglov

Новичок
WP
Простите, а где вы тут разрешаете, к примеру, стили? Как же мне теперь у себя в блоге писать красненьким? И зачем в блоге body и head? И где тут мне запретят использовать <img src=" j&amp;#65;vaScript:xss()">? И как вставить ссылку, если разрешен тег A, но не разрешен атрибут href?
 

kruglov

Новичок
triumvirat
хехехе...

Как, как, подумать и побороть.
Во-первых, есть чудесная функция html_entity_decode...
Во-вторых, можно почитать, как минимум, страничку http://ha.ckers.org/xss.html (третья ссылка в гугле по xss) и вообще, изучить вопрос.
 

WP

^_^
kruglov
Это просто пример :) Каждый может для себя указать нужные атрибуты и теги.
Единственное, при разрешении style необходимо подумать о "expression".
triumvirat
PHP:
 public function safe_uri($uri)
 {
  $uri = trim($uri);
  if (preg_match('~^(?:java|j|vb)script:~i',preg_replace('~\s+~','',$uri))) {return FALSE;}
  return TRUE;
 }
 

kruglov

Новичок
WP
Это просто пример
Ну тогда и echo htmlspecialchars($text) и даже echo $text - тоже просто примеры.

Единственное, при разрешении style необходимо подумать о "expression".
Вообще-то это далеко не единственное, о чем надо подумать при включении стилей.

if (preg_match('~^(?:java|j|vb)script:~i',preg_replace('~\s+~','',$uri))) {return FALSE;}
Ой, похакают вас...
 

kruglov

Новичок
triumvirat
Ну потому что он был бы сейчас не на коне, а, простите, в другом месте, потому как учить специальный livejournal-язык мало кто стал бы.

А так - можешь вообще не знать HTML - пиши, оформляя текст одними переводами строк. Вставить себе на страницу ролик с youtube? Запросто, копируем страшные символы, которые youtube для этого предлагает - и все работает.

Вставить результаты онлайн-теста? То же самое. Копируем любой HTML с другого сайта, он выглядит как надо.

Сколько народа пишет в Livejournal - и сколько в Википедию?

Массовость. Массовость требует простоты работы. Не грузить пользователя логической разметкой (как википедия). Не спорю, wiki-разметка - наверное, идеальное решение для баз знаний. Но только дня них.
 

Духовность™

Продвинутый новичок
kruglov
Сергей, Вы действительно считаете что ЖЖ приобрел популярность именно из-за HTML форматирования? :)

Я категорически не согласен. 1% юзеров ЖЖ знают, что такое HTML. Ютуб уже потом появился, как и визуальный редактор в ЖЖ. До этого все писали "как есть".
 

kruglov

Новичок
kruglov
Ну, не именно, но "в частности из-за".

Я бы не сказал, что только 1% знают про HTML. Самоучителей типа "Как выделиться в чате" в интернете завались. Одно дело - знание на уровне верстальщика, другое - <b>, <a href> и <font color>
Ну и появление визуального редактора стало возможным благодаря HTML-форматированию. Не кажется, что все как-то очень удачно сложилось?
 
Сверху