Обсуждалось в теме Изменение ссылок в ветках форума после переноса на другой хостинг
Скрипт нужно залить в корень форума и вызвать в браузере.
change_url.php
CODE:
<?php
#change_url.php
/****************************************************************************
Замена у всех ссылок одного домена на другой в постах форума ExBB FM 1.0 RC1.
Изменение ссылок в ветках форума после переноса на другой хостинг.
(c) 1Bot aka Strobe, 2012
****************************************************************************/
set_time_limit(0); // не ограничиваем время работы скрипта (важно для больших форумов!)
// основные параметры скрипта
$old_forum_addr = 'http://www.local.my'; // старый адрес сайта форума
$new_forum_addr = 'http://forum.local.my'; // новый адрес сайта форума
// будем искать и сравнивать по большим буквам, а заменять на малые
$old_forum_addr = strtoupper($old_forum_addr);
$new_forum_addr = strtolower($new_forum_addr);
$replace_count = 0; // количество замен
function replace_url($post)
{
global $replace_count, $old_forum_addr, $new_forum_addr;
// return str_replace($old_forum_addr, $new_forum_addr, $post);
// такой подход не учитывает регистр, в котором может быть прописан адрес,
// поэтому будем искать и сравнивать по большим буквам, а заменять на малые
$pos = strpos(strtoupper($post), $old_forum_addr);
if ($pos === false) return $post;
else
{
$replace_count++;
return substr($post, 0, $pos) . $new_forum_addr
. replace_url(substr($post, $pos + strlen($old_forum_addr)));
}
}
echo <<<DATA
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=win1251">
<meta http-equiv="Content-Language" content="ru">
<title>Замена у всех ссылок одного домена на другой в постах форума ExBB FM 1.0 RC1</title>
</head>
<body>
<p>Изменение ссылок в ветках форума после переноса на другой хостинг.</p>
<p>Cтарый адрес сайта форума: {$old_forum_addr}</p>
<p>Новый адрес сайта форума: {$new_forum_addr}</p>
<hr />
<pre>
DATA;
if ($df = @opendir('.'))
{ // пройти по всем форумам
while ($f = readdir($df))
{
if ('.' == $f || '..' == $f || !is_dir($f) || 'FORUM' !== strtoupper(substr($f,0,5))) continue;
// $f - папка форума /forumN (N - номер форума)
echo $f . "\n";
if ($dt = @opendir($f))
{ // пройти по всем темам
while ($t = readdir($dt))
{
if ('THD.PHP' !== strtoupper(substr($t,-7,7))) continue;
// $t - файл темы /forumN/id-thd.php (N - номер форума, id - номер темы)
$t = "./$f/$t";
echo ' ' . $t;
// считываем файл с сообщениями темы
// Читает файл для возможной записи в него не закрывая файла
$fp = @fopen($t, 'a+') or die("Could not read from the file <strong>$t</strong>");
flock($fp, 2);
$filesize = filesize($t);
$filesize = (0 === $filesize) ? 1 : $filesize-8;
fseek($fp, 8);
$th = fread($fp, $filesize);
$th = unserialize($th);
// пройти по всем сообщениям
$replace_count = 0;
foreach ($th as $id => $post_arr)
{ // замена url для сообщения
$th[$id]['post'] = replace_url($post_arr['post']);
}
// сохранение файла с сообщениями темы если были замены
if ($replace_count)
{
echo ' (произведено замен: ' . $replace_count . ')';
fseek ($fp, 0);
ftruncate ($fp, 0);
fwrite($fp, '<?die;?>' . serialize($th));
fflush($fp);
}
flock($fp, 3);
fclose($fp);
unset($th, $fp);
echo "\n";
}
closedir($dt);
}
}
closedir($df);
}
echo <<<DATA
</pre>
</body>
</html>
DATA;
?>
#change_url.php
/****************************************************************************
Замена у всех ссылок одного домена на другой в постах форума ExBB FM 1.0 RC1.
Изменение ссылок в ветках форума после переноса на другой хостинг.
(c) 1Bot aka Strobe, 2012
****************************************************************************/
set_time_limit(0); // не ограничиваем время работы скрипта (важно для больших форумов!)
// основные параметры скрипта
$old_forum_addr = 'http://www.local.my'; // старый адрес сайта форума
$new_forum_addr = 'http://forum.local.my'; // новый адрес сайта форума
// будем искать и сравнивать по большим буквам, а заменять на малые
$old_forum_addr = strtoupper($old_forum_addr);
$new_forum_addr = strtolower($new_forum_addr);
$replace_count = 0; // количество замен
function replace_url($post)
{
global $replace_count, $old_forum_addr, $new_forum_addr;
// return str_replace($old_forum_addr, $new_forum_addr, $post);
// такой подход не учитывает регистр, в котором может быть прописан адрес,
// поэтому будем искать и сравнивать по большим буквам, а заменять на малые
$pos = strpos(strtoupper($post), $old_forum_addr);
if ($pos === false) return $post;
else
{
$replace_count++;
return substr($post, 0, $pos) . $new_forum_addr
. replace_url(substr($post, $pos + strlen($old_forum_addr)));
}
}
echo <<<DATA
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=win1251">
<meta http-equiv="Content-Language" content="ru">
<title>Замена у всех ссылок одного домена на другой в постах форума ExBB FM 1.0 RC1</title>
</head>
<body>
<p>Изменение ссылок в ветках форума после переноса на другой хостинг.</p>
<p>Cтарый адрес сайта форума: {$old_forum_addr}</p>
<p>Новый адрес сайта форума: {$new_forum_addr}</p>
<hr />
<pre>
DATA;
if ($df = @opendir('.'))
{ // пройти по всем форумам
while ($f = readdir($df))
{
if ('.' == $f || '..' == $f || !is_dir($f) || 'FORUM' !== strtoupper(substr($f,0,5))) continue;
// $f - папка форума /forumN (N - номер форума)
echo $f . "\n";
if ($dt = @opendir($f))
{ // пройти по всем темам
while ($t = readdir($dt))
{
if ('THD.PHP' !== strtoupper(substr($t,-7,7))) continue;
// $t - файл темы /forumN/id-thd.php (N - номер форума, id - номер темы)
$t = "./$f/$t";
echo ' ' . $t;
// считываем файл с сообщениями темы
// Читает файл для возможной записи в него не закрывая файла
$fp = @fopen($t, 'a+') or die("Could not read from the file <strong>$t</strong>");
flock($fp, 2);
$filesize = filesize($t);
$filesize = (0 === $filesize) ? 1 : $filesize-8;
fseek($fp, 8);
$th = fread($fp, $filesize);
$th = unserialize($th);
// пройти по всем сообщениям
$replace_count = 0;
foreach ($th as $id => $post_arr)
{ // замена url для сообщения
$th[$id]['post'] = replace_url($post_arr['post']);
}
// сохранение файла с сообщениями темы если были замены
if ($replace_count)
{
echo ' (произведено замен: ' . $replace_count . ')';
fseek ($fp, 0);
ftruncate ($fp, 0);
fwrite($fp, '<?die;?>' . serialize($th));
fflush($fp);
}
flock($fp, 3);
fclose($fp);
unset($th, $fp);
echo "\n";
}
closedir($dt);
}
}
closedir($df);
}
echo <<<DATA
</pre>
</body>
</html>
DATA;
?>
нужно задать перед запуском
CODE:
// основные параметры скрипта
$old_forum_addr = 'http://www.local.my'; // старый адрес сайта форума
$new_forum_addr = 'http://forum.local.my'; // новый адрес сайта форума
$old_forum_addr = 'http://www.local.my'; // старый адрес сайта форума
$new_forum_addr = 'http://forum.local.my'; // новый адрес сайта форума
P.S. Собственно с помощью этого скрипта можно во всех постах форума поменять любую комбинацию символов на любую.