Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как найти слова в RTF-файле и заменить его на своё 
V
    Опции темы
Gold Dragon
Дата 25.11.2009, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



Документ RTF сформирован допустим в Word. Мне необходимо найти определённое слово в этом файле и заменить на своё. Как это можно сделать?


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
cia
Дата 25.11.2009, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 15.1.2007

Репутация: 4
Всего: 4



А str_replace или preg_replace не подойдет?
PM WWW ICQ   Вверх
Gold Dragon
Дата 25.11.2009, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



подойдёт.. сам процес замены я то знаю.. вот только в спецификации RTF не понимаю smile
попробовал почитать.. вроде всё понятно, вот только Word вносит много своего (может конечно и не лишнего) и я просто не пойму что искать и в какой виде


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Pitlord
Дата 25.11.2009, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 246
Регистрация: 31.10.2009

Репутация: 4
Всего: 7



Открой RTF-файл Блокнотом. Частный случай (windows-1251) может выглядеть так:
Код

<?php
function encode($s)
{
    $s = addCslashes($s, '\\{}');
    return preg_replace('/./e', 'ord("\\0") > 127 ? "\\\\\'" . bin2hex("\\0") : "\\0"', $s);
}

$es = encode('Строка!'); # \'d1\'f2\'f0\'ee\'ea\'e0!

# ...
?>

$es уже заменяешь в самом файле на другую строку, так же закодированную.

Мой пример может, в принципе, не заработать правильно, поскольку я не читал описание формата RTF.

Это сообщение отредактировал(а) Pitlord - 25.11.2009, 16:55
PM MAIL   Вверх
Gold Dragon
Дата 26.11.2009, 08:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



а что делает регулярка, можно описать?
допустим у меня в Ворде получается такой текст
Цитата

тескт сообщения __qwerty__ тескт сообщения

в коде вот это
Цитата

{\insrsid16451333 \'f2\'e5\'f1\'ea\'f2 \'f1\'ee\'ee\'e1\'f9\'e5\'ed\'e8\'ff }
{\b\i\insrsid16451333\charrsid16451333 __}{\b\i\lang1033\langfe1049\langnp1033\insrsid16451333\charrsid16451333 qwerty__}
{\lang1033\langfe1049\langnp1033\insrsid16451333  }{\insrsid16451333 \'f2\'e5\'f1\'ea\'f2 \'f1\'ee\'ee\'e1\'f9\'e5\'ed\'e8\'ff}

как видно, __qwerty__ то слово которое мне нужно найти и заменить разбито



--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
SoWa
Дата 26.11.2009, 08:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Харекришна
****


Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

Репутация: 6
Всего: 74



Есть вот такой код
Код

function rtf_isPlainText($s) {
    $failAt = array("*", "fonttbl", "colortbl", "datastore", "themedata");
    for ($i = ; $i < count($failAt); $i++)
        if (!empty($s[$failAt[$i]])) return false;
    return true;
}
function rtf2text($filename) {
    $text = file_get_contents($filename);
    if (!strlen($text))
        return "";
    $document = "";
    $stack = array();
    $j = -1;
    for ($i = ; $i < strlen($text); $i++) {
        $c = $text[$i];
        switch ($c) {
            case "\\":
                $nc = $text[$i + 1];
                if ($nc == '\\' && rtf_isPlainText($stack[$j])) $document .= '\\';
                elseif ($nc == '~' && rtf_isPlainText($stack[$j])) $document .= ' ';
                elseif ($nc == '_' && rtf_isPlainText($stack[$j])) $document .= '-';
                elseif ($nc == '*') $stack[$j]["*"] = true;
                elseif ($nc == "'") {
                    $hex = substr($text, $i + 2, 2);
                    if (rtf_isPlainText($stack[$j]))
                        $document .= html_entity_decode("&#".hexdec($hex).";");
                    $i += 2;
                } elseif ($nc >= 'a' && $nc <= 'z' || $nc >= 'A' && $nc <= 'Z') {
                    $word = "";
                    $param = null;
                    for ($k = $i + 1, $m = ; $k < strlen($text); $k++, $m++) {
                        $nc = $text[$k];
                        if ($nc >= 'a' && $nc <= 'z' || $nc >= 'A' && $nc <= 'Z') {
                            if (empty($param))
                                $word .= $nc;
                            else
                                break;
                        } elseif ($nc >= '0' && $nc <= '9')
                            $param .= $nc;
                        elseif ($nc == '-') {
                            if (empty($param))
                                $param .= $nc;
                            else
                                break;
                        } else
                            break;
                    }
                    $i += $m - 1;
                    $toText = "";
                    switch (strtolower($word)) {
                        case "u":
                            $toText .= html_entity_decode("&#x".dechex($param).";");
                            $ucDelta = @$stack[$j]["uc"];
                            if ($ucDelta > )
                                $i += $ucDelta;
                        break;
                        case "par": case "page": case "column": case "line": case "lbr":
                            $toText .= "\n"; 
                        break;
                        case "emspace": case "enspace": case "qmspace":
                            $toText .= " "; 
                        break;
                        case "tab": $toText .= "\t"; break;
                        case "chdate": $toText .= date("m.d.Y"); break;
                        case "chdpl": $toText .= date("l, j F Y"); break;
                        case "chdpa": $toText .= date("D, j M Y"); break;
                        case "chtime": $toText .= date("H:i:s"); break;
                        case "emdash": $toText .= html_entity_decode("—"); break;
                        case "endash": $toText .= html_entity_decode("–"); break;
                        case "bullet": $toText .= html_entity_decode("•"); break;
                        case "lquote": $toText .= html_entity_decode("‘"); break;
                        case "rquote": $toText .= html_entity_decode("’"); break;
                        case "ldblquote": $toText .= html_entity_decode("«"); break;
                        case "rdblquote": $toText .= html_entity_decode("»"); break;
                        default:
                            $stack[$j][strtolower($word)] = empty($param) ? true : $param;
                        break;
                    }
                    if (rtf_isPlainText($stack[$j]))
                        $document .= $toText;
                }
                $i++;
            break;
            case "{":
                array_push($stack, $stack[$j++]);
            break;
            case "}":
                array_pop($stack);
                $j--;
            break;
            case '\0': case '\r': case '\f': case '\n': break;
            default:
                if (rtf_isPlainText($stack[$j]))
                    $document .= $c;
            break;
        }
    }
    return $document;
}

И взят он вот отсюда.
Может быть, это поможет тебе сделать жизнь проще )
По крайней мере прочитать- это уже половина дела smile

Добавлено через 1 минуту и 49 секунд
А еще есть вот это
Библиотека для работы с этим форматом.


--------------------
Всем добра smile
PM MAIL ICQ   Вверх
Gold Dragon
Дата 26.11.2009, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



хорошая и познавательная статья.. Но всё же она ориентирована на чистый RTF.
Вот только WORD уж очень коверкает код, но его форматирование необходимо для создания шаблонов документов


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Gold Dragon
Дата 26.11.2009, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



в общем.. все выше приведённые коды работают.. малость подправить только smile
а выход нашёл.. OpenOffice использовать для создания шаблонов.. Форматирование позволяет делать, а код практически идеально чистый smile

Будем считать что тема закрыта, не стоит тратить столько времени на Word smile хотя если кто найдёт решения буду только рад посмотреть


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0497 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.