Sirius Опубликовано 3 апреля, 2014 Жалоба Поделиться Опубликовано 3 апреля, 2014 Судя по всему (но не факт!), вот этот код содержит багу, из-за которой после редактирования сообщения на нашем форуме к смайликам добавляется сочетание "/>". Я буду, конечно, сам пытаться вкурить, что здесь не так, но может, коллективный разум быстрее подскажет, где зарылась собака. public static function unconvertSmilies( $txt ) { //----------------------------------------- // Unconvert smilies //----------------------------------------- $txt = str_replace( "<#EMO_DIR#>", "default", $txt ); preg_match_all( "#(<img(?:[^>]+?)class=['\"]bbc_emoticon[\"'](?:[^>]+?)alt=['\"](.+?)[\"'](?:[^>]+?))#is", $txt, $matches ); if( is_array($matches[1]) AND count($matches[1]) ) { foreach( $matches[1] as $index => $value ) { if ( count( ipsRegistry::cache()->getCache('emoticons') ) > 0 ) { foreach( ipsRegistry::cache()->getCache('emoticons') as $row ) { $_emoCode = str_replace( '<', '<', str_replace( '>', '>', $row['typed'] ) ); if( $matches[2][ $index ] == $_emoCode ) { /* We need to make sure emoticons are wrapped in spaces so they are parsed properly */ //$txt = str_replace( $value, ' ' . $_emoCode . ' ', $txt ); /* We are no longer matching opening/closing "space" so no need to add it */ $txt = str_replace( $value, $_emoCode, $txt ); continue 2; } } } } } $txt = str_replace( "default", "<#EMO_DIR#>", $txt ); return $txt; } Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Sirius Опубликовано 3 апреля, 2014 Автор Жалоба Поделиться Опубликовано 3 апреля, 2014 Еще, как вариант, проблема может быть в следующем коде: /** * This function processes the text before showing for editing, etc * Used for rebuilding after upgrade to 3.0 * * @access public * @param string Raw text * @return string Converted text */ public function preEditParse( $txt="" ) { //----------------------------------------- // Before we start, strip newlines or we'll // end up duplicating them //----------------------------------------- $txt = str_replace( "\n", "", $txt ); $txt = str_replace( "\r", "", $txt ); //----------------------------------------- // Clean up BR tags //----------------------------------------- if ( !$this->parse_html OR $this->parse_nl2br ) { $txt = str_replace( "<br>" , "\n", $txt ); $txt = str_replace( "<br .", "\n", $txt ); } # Make EMO_DIR safe so the ^> regex works $txt = str_replace( "<#EMO_DIR#>", "default", $txt ); # New emo $txt = preg_replace( "#(\s)?<([^>]+?)emoid=\"(.+?)\"([^>]*?)".">(\s)?#is", "\\1\\3\\5", $txt ); # And convert it back again... $txt = str_replace( "default", "<#EMO_DIR#>", $txt ); # Legacy $txt = preg_replace( "#<!--emo&(.+?)-->.+?<!--endemo-->#", "\\1" , $txt ); # New (3.0) $txt = $this->unconvertSmilies( $txt ); //----------------------------------------- // Clean up nbsp //----------------------------------------- $txt = str_replace( ' ', "\t", $txt ); $txt = str_replace( ' ' , " ", $txt ); if ( $this->parse_bbcode ) { //----------------------------------------- // Custom bbcode... //----------------------------------------- $txt = preg_replace( "#<acronym title=[\"'](.+?)['\"]>(.+?)</acronym>#is", "[acronym=\"\\1\"]\\2[/acronym]", $txt ); $txt = preg_replace( "#<a href=[\"']index\.php\?automodule=blog(&|&)showentry=(.+?)['\"]>(.+?)</a>#is", "[entry=\"\\2\"]\\3[/entry]", $txt ); $txt = preg_replace( "#<a href=[\"']index\.php\?automodule=blog(&|&)blogid=(.+?)['\"]>(.+?)</a>#is", "[blog=\"\\2\"]\\3[/blog]", $txt ); $txt = preg_replace( "#<a href=[\"']index\.php\?act=findpost(&|&)pid=(.+?)['\"]>(.+?)</a>#is", "[post=\"\\2\"]\\3[/post]", $txt ); $txt = preg_replace( "#<a href=[\"']index\.php\?showtopic=(.+?)['\"]>(.+?)</a>#is", "[topic=\"\\1\"]\\2[/topic]", $txt ); $txt = preg_replace( "#<a href=[\"'](.*?)index\.php\?act=findpost(&|&)pid=(.+?)['\"]><\{POST_SNAPBACK\}></a>#is", "[snapback]\\3[/snapback]", $txt ); $txt = preg_replace( "#<div class=[\"']codetop['\"]>(.+?)</div><div class=[\"']codemain['\"] style=[\"']height:200px;white\-space:pre;overflow:auto['\"]>(.+?)</div>#is", "[codebox]\\2[/codebox] ", $txt ); $txt = preg_replace( "#<!--blog\.extract\.start-->(.+?)<!--blog\.extract\.end-->#is", "\\1", $txt ); $txt = preg_replace( "#(.+?)#is", " \\1 ", $txt ); //----------------------------------------- // SQL //----------------------------------------- $txt = preg_replace_callback( "#<!--sql-->(.+?)<!--sql1-->(.+?)<!--sql2-->(.+?)<!--sql3-->#is", array( &$this, 'unconvert_sql'), $txt ); //----------------------------------------- // HTML //----------------------------------------- $txt = preg_replace_callback( "#<!--html-->(.+?)<!--html1-->(.+?)<!--html2-->(.+?)<!--html3-->#is", array( &$this, 'unconvert_htm'), $txt ); //----------------------------------------- // Images / Flash //----------------------------------------- $txt = preg_replace_callback( "#<!--Flash (.+?)-->.+?<!--End Flash-->#", array( &$this, 'unconvert_flash'), $txt ); $txt = preg_replace( "#]+?>#is" , "\[img\]\\1\[/img\]" , $txt ); //----------------------------------------- // Email, URLs //----------------------------------------- $txt = preg_replace( "#(.+?)#s" , "\[email=\\1\]\\2\[/email\]" , $txt ); $txt = preg_replace( "#(.+?)#s" , "\[url=\"\\1\\2\"\]\\3\[/url\]" , $txt ); //----------------------------------------- // Quote //----------------------------------------- $txt = preg_replace( "#<!--QuoteBegin-->(.+?)<!--QuoteEBegin-->#" , '' , $txt ); $txt = preg_replace( "#<!--QuoteBegin-{1,2}([^>]+?)\+([^>]+?)-->(.+?)<!--QuoteEBegin-->#", "" , $txt ); $txt = preg_replace( "#<!--QuoteBegin-{1,2}([^>]+?)\+-->(.+?)<!--QuoteEBegin-->#" , "" , $txt ); $txt = preg_replace( "#<!--QuoteEnd-->(.+?)<!--QuoteEEnd-->#" , '' , $txt ); //----------------------------------------- // Super old quotes //----------------------------------------- $txt = preg_replace( "#\#i" , "", $txt ); //----------------------------------------- // URL Inside Quote //----------------------------------------- $txt = preg_replace( "#\(.+?)\[\/url\]\]#i"' date=' "", str_replace( "\\", "", $txt ) ); //----------------------------------------- // New quote //----------------------------------------- $txt = preg_replace_callback( "#<!--quoteo([^>]+?)?-->(.+?)<!--quotec-->#si", array( &$this, '_parse_new_quote'), $txt ); //----------------------------------------- // Ident => Block quote //----------------------------------------- while( preg_match( "# [indent](.+?)[/indent] #is" , $txt ) ) { $txt = preg_replace( "# [indent](.+?)[/indent] #is" , " [indent]\\1[/indent] ", $txt ); } //----------------------------------------- // CODE //----------------------------------------- $txt = preg_replace( "#<!--c1-->(.+?)<!--ec1-->#", '[code]' , $txt ); $txt = preg_replace( "#<!--c2-->(.+?)<!--ec2-->#", '[/code] ', $txt ); //----------------------------------------- // left, right, center //----------------------------------------- $txt = preg_replace( "#(.+?)#is" , "[\\1]\\2[/\\1]", $txt ); //----------------------------------------- // Start off with the easy stuff //----------------------------------------- $txt = $this->parse_simple_tag_recursively( 'b' , 'b' , 0, $txt ); $txt = $this->parse_simple_tag_recursively( 'i' , 'i' , 0, $txt ); $txt = $this->parse_simple_tag_recursively( 'u' , 'u' , 0, $txt ); $txt = $this->parse_simple_tag_recursively( 'strike', 's' , 0, $txt ); $txt = $this->parse_simple_tag_recursively( 'sub' , 'sub', 0, $txt ); $txt = $this->parse_simple_tag_recursively( 'sup' , 'sup', 0, $txt ); //----------------------------------------- // List headache //----------------------------------------- $txt = preg_replace( "#(\n){0,1}#" , "\\1\[list\]" , $txt ); $txt = preg_replace( "#(\n){0,1}#" , "\\1\[list=1\]" , $txt ); $txt = preg_replace( "#(\n){0,1}#" , "\\1\[list=\\2\]\n" , $txt ); $txt = preg_replace( "#(\n){0,1}#" , "\n\[*\]" , $txt ); $txt = preg_replace( "#(\n){0,1}(\n){0,1}#", "\n\[/list\]\\2" , $txt ); $txt = preg_replace( "#(\n){0,1}(\n){0,1}#", "\n\[/list\]\\2" , $txt ); //----------------------------------------- // Opening style attributes //----------------------------------------- $txt = preg_replace( "#<!--sizeo:(.+?)-->(.+?)<!--/sizeo-->#" , "[size=\\1]" , $txt ); $txt = preg_replace( "#<!--coloro:(.+?)-->(.+?)<!--/coloro-->#" , "[color=\"\\1\"]", $txt ); $txt = preg_replace( "#<!--fonto:(.+?)-->(.+?)<!--/fonto-->#" , "[font=\"\\1\"]" , $txt ); $txt = preg_replace( "#<!--backgroundo:(.+?)-->(.+?)<!--/backgroundo-->#" , "[background=\\1]" , $txt ); //----------------------------------------- // Closing style attributes //----------------------------------------- $txt = preg_replace( "#<!--sizec-->(.+?)<!--/sizec-->#" , "[/size]" , $txt ); $txt = preg_replace( "#<!--colorc-->(.+?)<!--/colorc-->#" , "[/color]", $txt ); $txt = preg_replace( "#<!--fontc-->(.+?)<!--/fontc-->#" , "[/font]" , $txt ); $txt = preg_replace( "#<!--backgroundc-->(.+?)<!--/backgroundc-->#", "[/background]" , $txt ); //----------------------------------------- // LEGACY SPAN TAGS //----------------------------------------- //----------------------------------------- // WYSI-Weirdness #9923464: Opera span tags //----------------------------------------- while ( preg_match( "#(.+?)#is", $txt ) ) { $txt = preg_replace( "#(.+?)#is", "\[font=\\1\]\\2\[/font\]", $txt ); } while ( preg_match( "#(.+?)#is", $txt ) ) { $txt = preg_replace_callback( "#(.+?)#is" , array( &$this, 'unconvert_size' ), $txt ); } while ( preg_match( "#(.+?)#is", $txt ) ) { $txt = preg_replace( "#(.+?)#is" , "\[color=" . trim("\\1") . "\]\\2\[/color\]", $txt ); } while ( preg_match( "#(.+?)#is", $txt ) ) { $txt = preg_replace( "#(.+?)#is", "\[font=\"" . trim("\\1") . "\"\]\\2\[/font\]", $txt ); } while ( preg_match( "#(.+?)#is", $txt ) ) { $txt = preg_replace( "#(.+?)#is", "\[background=\\1\]\\2\[/font\]", $txt ); } # Legacy $txt = preg_replace( "#(.+?)#is" , "\[s\]\\1\[/s\]" , $txt ); //----------------------------------------- // Tidy up the end quote stuff //----------------------------------------- $txt = preg_replace( "#(\[/quote\])\s*? $txt = preg_replace( "#(\[/quote\])\s*? \s*#si" , "\\1\n", $txt ); $txt = preg_replace( "#<!--EDIT\|.+?\|.+?-->#" , "" , $txt ); $txt = str_replace( "", "", $txt ); $txt = str_replace( "", "", $txt ); } //----------------------------------------- // Unconvert custom bbcode //----------------------------------------- $txt = $this->post_db_unparse_bbcode( $txt ); //----------------------------------------- // Parse html //----------------------------------------- if ( $this->parse_html ) { $txt = str_replace( "'", "'", $txt); } return trim(stripslashes($txt)); } Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Вечная память GSMmaster Опубликовано 3 апреля, 2014 Вечная память Жалоба Поделиться Опубликовано 3 апреля, 2014 Судя по всему, проблема в самой базе данных. Никто ничего в тот момент не трогал, а оно вылезло. Я склоняюсь к нарушению БД. Цитата Будьте впевненi, бабулю - Ваше поросятко здохло! Ссылка на комментарий Поделиться на другие сайты Поделиться
Neinsager Опубликовано 3 апреля, 2014 Жалоба Поделиться Опубликовано 3 апреля, 2014 GSMmasterА как в базе сообщение хранится? Можно увидеть результат простого select'а по какому-нить тестовому сообщению? Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Вечная память GSMmaster Опубликовано 3 апреля, 2014 Вечная память Жалоба Поделиться Опубликовано 3 апреля, 2014 Это уже не ко мне вопрос :) Цитата Будьте впевненi, бабулю - Ваше поросятко здохло! Ссылка на комментарий Поделиться на другие сайты Поделиться
Neinsager Опубликовано 3 апреля, 2014 Жалоба Поделиться Опубликовано 3 апреля, 2014 Да это понятно :D Собственно — чтоб понять, как оно через regexp'овые поиски/замены проходит, надо видеть то, что в базе хранится. Это если проблема в php-коде. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Вечная память GSMmaster Опубликовано 3 апреля, 2014 Вечная память Жалоба Поделиться Опубликовано 3 апреля, 2014 Ну можешь взять копию базы, проинсталлить движок форума под апачем, базу в мускуль и рули на локальной машинке. Цитата Будьте впевненi, бабулю - Ваше поросятко здохло! Ссылка на комментарий Поделиться на другие сайты Поделиться
Sirius Опубликовано 3 апреля, 2014 Автор Жалоба Поделиться Опубликовано 3 апреля, 2014 Вариантов может быть несколько. Либо сообщение портится, перед тем как записаться в БД и уходит туда уже со скобками. Но тогда возникает вопрос, почему оно из БД достается в нормальном виде? Мы-то видим его при просмотре нормально. Значит, этот вариант отпадает. Либо, второй вариант, сообщение портится, когда включается редактирование уже существующего сообщения. Сначала сообщение нормально извлекается из БД, а потом портится вышеприведенными функциями, которые осуществляют преEdit-парсинг. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Sirius Опубликовано 3 апреля, 2014 Автор Жалоба Поделиться Опубликовано 3 апреля, 2014 Никто ничего в тот момент не трогал, а оно вылезло.Так не бывает. Очень сомневаюсь в этом. Кто-то что-то тронул. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Вечная память GSMmaster Опубликовано 3 апреля, 2014 Вечная память Жалоба Поделиться Опубликовано 3 апреля, 2014 Мое мнение - проинсталлить на тестовом компе чистый движок, запихать текущую копию БД и проверить на глюк. Если пропало - траблы в коде, не пропало - в БД. Гадать просто замучитесь... Я хорошо помню, когда глюк вылез, никто ничего с движком не делал, 100%. Цитата Будьте впевненi, бабулю - Ваше поросятко здохло! Ссылка на комментарий Поделиться на другие сайты Поделиться
Nixoid Опубликовано 3 апреля, 2014 Жалоба Поделиться Опубликовано 3 апреля, 2014 (изменено) test Изменено 3 апреля, 2014 пользователем SlavaD Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Neinsager Опубликовано 3 апреля, 2014 Жалоба Поделиться Опубликовано 3 апреля, 2014 NixoidПроблема именно после редактирования, видите? Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Вечная память GSMmaster Опубликовано 3 апреля, 2014 Вечная память Жалоба Поделиться Опубликовано 3 апреля, 2014 Иногда и после цитирования. Цитата Будьте впевненi, бабулю - Ваше поросятко здохло! Ссылка на комментарий Поделиться на другие сайты Поделиться
Nixoid Опубликовано 3 апреля, 2014 Жалоба Поделиться Опубликовано 3 апреля, 2014 ну тут проблема при обратном парсинге, там парсится в обратном направлении html в bbcodи гдето чтото лишнее цепляется. мне сложно тестировать потому как вы выбрали функции из класа а эти функции дергают еще другие методы и данные. Если я чтото найду именно в этих кусках кода, я напишу :) Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Moloch Опубликовано 3 апреля, 2014 Жалоба Поделиться Опубликовано 3 апреля, 2014 (изменено) :whistle:/>/>/> узнать, примерно, когда пошёл баг с цитированием\редактированиеми посмотреть на сервере последнюю дату изменения файловдаты не совпадают-смотреть БД редактируем :pardon:/>/> на тему смайлов и бб кодов-в конце смайла должно идти такое . или нет? test_check Изменено 3 апреля, 2014 пользователем Moloch Цитата пыщ-пыщ Ссылка на комментарий Поделиться на другие сайты Поделиться
Dolphin Опубликовано 3 апреля, 2014 Жалоба Поделиться Опубликовано 3 апреля, 2014 (изменено) Хоть смайлы портятся и в конце строки без окончания пробелом, и будучи окруженными пробелами, меня смущает закоменченность этой строки: /* We need to make sure emoticons are wrapped in spaces so they are parsed properly */ //$txt = str_replace( $value, ' ' . $_emoCode . ' ', $txt ); /* We are no longer matching opening/closing "space" so no need to add it */ Какова предыстория сего действа? Изменено 3 апреля, 2014 пользователем Dolphin Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Nixoid Опубликовано 3 апреля, 2014 Жалоба Поделиться Опубликовано 3 апреля, 2014 (изменено) так мне сложно тестировать попробуйте в первой функции поменять строку preg_match_all( "#(<img(?:[^>]+?)class=['\"]bbc_emoticon[\"'](?:[^>]+?)alt=['\"](.+?)[\"'](?:[^>]+?))#is", $txt, $matches ); на preg_match_all( "#(<img(?:[^>]+?)class=['\"]bbc_emoticon[\"'](?:[^>]+?)alt=['\"](.+?)[\"'](?:[^>]+?)>)#is", $txt, $matches ); Изменено 3 апреля, 2014 пользователем Nixoid Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
SlavaD Опубликовано 3 апреля, 2014 Жалоба Поделиться Опубликовано 3 апреля, 2014 > select * from posts where pid=269284; test <br . <br . <img src='http://simferopol.in/public/style_emoticons/<#EMO_DIR#>/rolleyes2.gif' class='bbc_emoticon' alt=':rolleyes2:/>/>' . криво отобразилось... сек во Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Sirius Опубликовано 3 апреля, 2014 Автор Жалоба Поделиться Опубликовано 3 апреля, 2014 Test :) Check it It works! Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Nixoid Опубликовано 3 апреля, 2014 Жалоба Поделиться Опубликовано 3 апреля, 2014 Test :) Check it It works! Это тема не для тестов!!!!! Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Dolphin Опубликовано 3 апреля, 2014 Жалоба Поделиться Опубликовано 3 апреля, 2014 (изменено) Вроде полегчало. Что сделал? Изменено 3 апреля, 2014 пользователем Dolphin Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Sirius Опубликовано 3 апреля, 2014 Автор Жалоба Поделиться Опубликовано 3 апреля, 2014 Изменил строчку кода на ту, что выложил Nixoid. Судя по всему, проблема решена. Но надо будет проконтролировать какое-то время. Nixoid'у огромное спасибо за помощь! Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Вечная память GSMmaster Опубликовано 3 апреля, 2014 Вечная память Жалоба Поделиться Опубликовано 3 апреля, 2014 И теперь большущий вопрос, откуда сия хрень вылезла... Вроде на неосмысленный сбой ну никак не похоже. Модов никаких в тот момент никто не ставил, в админке не ковырялись... Загадка :) Цитата Будьте впевненi, бабулю - Ваше поросятко здохло! Ссылка на комментарий Поделиться на другие сайты Поделиться
manny Опубликовано 3 апреля, 2014 Жалоба Поделиться Опубликовано 3 апреля, 2014 А какой версии у вас софт?Вот, нашел куски v3.2.3, в ней все кошерно: http://eathena-tools.googlecode.com/svn-history/r113/trunk/bugreports/core.php preg_match_all( "#(<img(?:[^>]+?)class=['\"]bbc_emoticon[\"'](?:[^>]+?)alt=['\"](.+?)[\"'](?:[^>]+?)?>)#is", $txt, $matches ); Цитата “Любовь к родине не знает чужих границ.”— Станислав Ежи Лец Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.