Перейти к содержанию
Симферопольский Форум

PHP-программеры нужна помощь!


Рекомендуемые сообщения

Судя по всему (но не факт!), вот этот код содержит багу, из-за которой после редактирования сообщения на нашем форуме к смайликам добавляется сочетание "/>".

 

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

 

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;
       }

Ссылка на комментарий
Поделиться на другие сайты

Еще, как вариант, проблема может быть в следующем коде:

 

/**
 * 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));
	}

Ссылка на комментарий
Поделиться на другие сайты

  • Вечная память
Судя по всему, проблема в самой базе данных. Никто ничего в тот момент не трогал, а оно вылезло. Я склоняюсь к нарушению БД.
Будьте впевненi, бабулю - Ваше поросятко здохло!
Ссылка на комментарий
Поделиться на другие сайты

GSMmaster

А как в базе сообщение хранится? Можно увидеть результат простого select'а по какому-нить тестовому сообщению?

Ссылка на комментарий
Поделиться на другие сайты

  • Вечная память
Это уже не ко мне вопрос :)
Будьте впевненi, бабулю - Ваше поросятко здохло!
Ссылка на комментарий
Поделиться на другие сайты

Да это понятно :D

 

Собственно — чтоб понять, как оно через regexp'овые поиски/замены проходит, надо видеть то, что в базе хранится. Это если проблема в php-коде.

Ссылка на комментарий
Поделиться на другие сайты

  • Вечная память
Ну можешь взять копию базы, проинсталлить движок форума под апачем, базу в мускуль и рули на локальной машинке.
Будьте впевненi, бабулю - Ваше поросятко здохло!
Ссылка на комментарий
Поделиться на другие сайты

Вариантов может быть несколько. Либо сообщение портится, перед тем как записаться в БД и уходит туда уже со скобками. Но тогда возникает вопрос, почему оно из БД достается в нормальном виде? Мы-то видим его при просмотре нормально. Значит, этот вариант отпадает.

 

Либо, второй вариант, сообщение портится, когда включается редактирование уже существующего сообщения. Сначала сообщение нормально извлекается из БД, а потом портится вышеприведенными функциями, которые осуществляют преEdit-парсинг.

Ссылка на комментарий
Поделиться на другие сайты

Никто ничего в тот момент не трогал, а оно вылезло.

Так не бывает. Очень сомневаюсь в этом. Кто-то что-то тронул.

Ссылка на комментарий
Поделиться на другие сайты

  • Вечная память
Мое мнение - проинсталлить на тестовом компе чистый движок, запихать текущую копию БД и проверить на глюк. Если пропало - траблы в коде, не пропало - в БД. Гадать просто замучитесь... Я хорошо помню, когда глюк вылез, никто ничего с движком не делал, 100%.
Будьте впевненi, бабулю - Ваше поросятко здохло!
Ссылка на комментарий
Поделиться на другие сайты

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

ну тут проблема при обратном парсинге, там парсится в обратном направлении html в bbcod

и гдето чтото лишнее цепляется.

 

 

мне сложно тестировать потому как вы выбрали функции из класа а эти функции дергают еще другие методы и данные.

 

Если я чтото найду именно в этих кусках кода, я напишу :)

Ссылка на комментарий
Поделиться на другие сайты

:whistle:/>/>/> узнать, примерно, когда пошёл баг с цитированием\редактированием

и посмотреть на сервере последнюю дату изменения файлов

даты не совпадают-смотреть БД

 

редактируем :pardon:/>/>

 

на тему смайлов и бб кодов-в конце смайла должно идти такое . или нет?

 

test_check :whistle:

Изменено пользователем Moloch
пыщ-пыщ
Ссылка на комментарий
Поделиться на другие сайты

Хоть смайлы портятся и в конце строки без окончания пробелом, и будучи окруженными пробелами, меня смущает закоменченность этой строки:

 

/* 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 */

 

Какова предыстория сего действа?

Изменено пользователем Dolphin
Ссылка на комментарий
Поделиться на другие сайты

так мне сложно тестировать

 

попробуйте в первой функции поменять строку

 

 

preg_match_all( "#(<img(?:[^>]+?)class=['\"]bbc_emoticon[\"'](?:[^>]+?)alt=['\"](.+?)[\"'](?:[^>]+?))#is", $txt, $matches );

 

на

 

 

preg_match_all( "#(<img(?:[^>]+?)class=['\"]bbc_emoticon[\"'](?:[^>]+?)alt=['\"](.+?)[\"'](?:[^>]+?)>)#is", $txt, $matches );

Изменено пользователем Nixoid
Ссылка на комментарий
Поделиться на другие сайты

> 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:/>/>' .

криво отобразилось... сек

 

simf-bug.jpeg

во

Ссылка на комментарий
Поделиться на другие сайты

Изменил строчку кода на ту, что выложил Nixoid. :beer2:

 

Судя по всему, проблема решена. Но надо будет проконтролировать какое-то время.

 

Nixoid'у огромное спасибо за помощь!

Ссылка на комментарий
Поделиться на другие сайты

  • Вечная память
И теперь большущий вопрос, откуда сия хрень вылезла... Вроде на неосмысленный сбой ну никак не похоже. Модов никаких в тот момент никто не ставил, в админке не ковырялись... Загадка :)
Будьте впевненi, бабулю - Ваше поросятко здохло!
Ссылка на комментарий
Поделиться на другие сайты

А какой версии у вас софт?

Вот, нашел куски 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 );

“Любовь к родине не знает чужих границ.”

— Станислав Ежи Лец

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...

Чат

Чат

Please enter your display name

×
×
  • Создать...