БлогNot. Заменяем табуляции на пробелы без изменения внешнего вида текста

Заменяем табуляции на пробелы без изменения внешнего вида текста

Символ табуляции может заменить несколько подряд идущих пробелов и позволяет удобно выравнивать столбцы в текстовом документе, но он же способен создать серьёзные проблемы, если мы откроем текст в редакторе с другим отступом табуляции.

Самое безопасное - не использовать табуляцию вообще, тогда и Excel, например, сумеет открыть текстовый файл в формате "с фиксированной шириной столбцов", а иначе несколько подряд идущих табуляций, да ещё и перемешанных с пробелами, собьют его с толку.

Прилагаемый ниже маленький сервис на PHP сегодня помог мне решить проблему замены табуляций пробелами.

Предполагается, что основной исходный файл сервиса index.php будет сохранён в кодировке Юникода utf-8 и загружаемые текстовые файлы будут закодированы в ней же.

Так как сервис загружает файл на сервер, прикладываю только исходник без онлайна, проверял в Denwer, больше ничего не было под рукой.

В папке с файлом index.php также расположен файл .htaccess со следующим содержимым:

AddDefaultCharset utf-8
php_value display_errors 1

Для загрузки файлов в папке со скриптом создана вложенная папка uploads. Обработанный текстовый файл удаляется из неё, а результат работы выводится в многострочное текстовое поле <textarea>.

Следите, чтобы ваш текстовый редактор, куда вы будете вставлять текст из поля результата, не делал автоматическую замену пробелов табуляциями. Например, Notepad++ перестаёт баловаться с автозаменой табуляциями, если заранее отключить соответствующую опцию: меню Опции - Настройки - Синтаксисы - Настройка табуляции, включить флажок "Заменять пробелом".

Ну и, наконец, сам исходник.

<!DOCTYPE html>
<html lang="ru">
<head>
 <title>Detab</title>
 <meta charset="utf-8">
</head><body>	

<?php
 if (isset($_POST['submit'])) {
  $error = '';
  if ($_FILES['filename']['size'] > 1*1024*1024) {
   $error = 'Файл больше 1 Мб!'; 
  }
  if (is_uploaded_file($_FILES['filename']['tmp_name'])) {
   $newname = './upload/'.basename($_FILES['filename']['name']);
   move_uploaded_file($_FILES['filename']['tmp_name'], $newname);
   $error = 'Файл загружен';
   $arr = file ($newname);
   $n = count ($arr);
   $res = '';
   $tsize = 8;
   if (isset($_POST['tsize'])) $tsize = intval($_POST['tsize']);
   if ($tsize < 1 or $tsize > 16) $tsize = 8;
   mb_internal_encoding("UTF-8");
   for ($i = 0; $i < $n; $i++) {
    $str = $arr [$i];
    $len = mb_strlen ($str,'UTF-8');
    $newstr = '';
    for ($k = 0; $k < $len; $k++) {
     $c = mb_substr($str,$k,1,'UTF-8');
     if (ord($c) == 9) {
      $tabs = mb_strlen ($newstr,'UTF-8');
      for ($j = 0; $j < $tsize - $tabs % $tsize; $j++) $newstr .= ' ';
     }
     else $newstr .= $c;
    }
    $res .= $newstr;
   }
   echo '<textarea rows="16" cols="90">'.$res.'</textarea>';
   @unlink ($newname);
  }
  else {
   $error = 'Ошибка загрузки файла!';
  }
  echo '<p>'.$error.'. <a href="index.php">Назад</a></p>';
 }
 else {
  echo '<form method="post" enctype="multipart/form-data">'."\n".
       'Имя файла: <input type="file" name="filename">'."\n".
       'Размер табуляции (от 1 до 16): <input type="number" 
         name="tsize" min="1" max="16" value="8" required>'."\n".
       ' <input type="submit" name="submit" value="Загрузить">'."\n".
       '</form>';
 }
?>
</body>
</html>
загрузка файла в сервис
загрузка файла в сервис
результат работы сервиса (в Far открыт исходный файл, в браузере - преобразованный текст)
результат работы сервиса (в Far открыт исходный файл, в браузере - преобразованный текст)

 Сложный тестик с табуляциями для скрипта - таблица стран мира формата .txt (кодировка UTF-8) в архиве .zip (8 Кб)


теги: php программирование сервис

02.11.2019, 17:06; рейтинг: 49