Я здесь новенькая, но PHP привлёк меня, хотелось бы освоить хотя бы базовые навыки.
Эммм, о чем это я)? Нажила на свою голову нелегкую задачу...
Т.к. с PHP начала знакомится 8 часов назад, прошу не высмеивать меня :rolleyes:
Есть у меня огромный (8мб) текстовый файл, но вот беда, злые "татары" сделали этот текст непригодным для поисковых систем, что меня ни в коем случае не устраивает :o
В тексте есть HTML теги, русские и английские слова, разнообразные символы. Часть русских и английских слов зашифрована от поисковых систем методом перестановки некоторых букв в словах на схожие по визуальному опознаванию буквы из противоположного языка. Приведу пример:
"Фoтoaппapaт Nikоn" (в первом слове буквы "o", "a" и "p" латинские, а во втором слове "i" и "о" - русские буквы.
Так же в тексте много неискаженных слов, а задачей является привести текст в нормальный вид.
Порылась я, порылась, и случайно наткнулась на функцию, которой как раз под силу справиться с поставленной задачей:
// Замена графически похожих латинских букв на русские буквы в русских словах и наоборот
function ruslat ($text)
{
// Соответствие букв русского и латинского алфавита
$abc = array(
"a" => "а",
"A" => "А",
"c" => "с",
"C" => "С",
"e" => "е",
"E" => "Е",
"T" => "Т",
"H" => "Н",
"o" => "о",
"O" => "О",
"p" => "р",
"P" => "Р",
"k" => "к",
"K" => "К",
"x" => "х",
"X" => "Х",
"B" => "В",
"M" => "М",
"b" => "ь",
"r" => "г",
"y" => "у",
"Y" => "У"
);
// Незаменимые русские символы
$russian = "шщфыджэячибю";
// Незаменимые латинские символы
$latin = "qwisdfgjzv";
// Строка с результатом
$result = "";
// Разбиваем текст на слова и работаем с каждым словом
$words = split(" ", $text);
foreach ($words as $word) {
if (!preg_match("#***91;$latin***93;+#i", $word)) {
foreach ($abc as $lat => $rus) {
$word = str_replace($lat, $rus, $word);
}
} elseif (!preg_match("#***91;$russian***93;+#i", $word)) {
foreach ($abc as $lat => $rus) {
$word = str_replace($rus, $lat, $word);
}
}
$result .= $word." ";
}
return trim($result);
}
Казалось бы, всё же просто, но это только если человек знаком с PHP, а я никогда глубже HTML ни во что не вникала. :(
Мучалась всю ночь, и так крутила, и сяк, и маны читала по PHP - бестолку, всё чего добилась, даже стыдно показывать, это вот:
<?php
set_time_limit(0);
$filename = '1.txt';
$file = file_get_contents($filename);
file_put_contents('2.txt', $file);
?>
Проверила с помощью Denwera - работает, т.к. при выполнении скрипта меняется дата изменения файла :D Но понятно же, что скрипт ничего не делает, кроме как копирует текст из одного файла в другой.
Умоляю Вас, господа программисты, не сочтите за дикость или наглость, подскажите, как мне прикрутить функцию ruslat в мой код, чтобы обработать скриптом текстовый файл большого размера?
Благодарю за внимание.
С уважением, начинающая "программистка" Анастасия.
Спустя 5 минут, 13 секунд (13.06.2012 - 16:55) Семён написал(а):
У тебя есть функция которую ты не вызвала
Спустя 7 минут, 14 секунд (13.06.2012 - 17:02) medvedeva написал(а):
Семён как не странно, но это же очевидно, ибо как не пыталась её "вызвать", всё бестолку, или ошибка при выполнении скрипта, или ничего не происходит.
Цитата (medvedeva @ 13.06.2012 - 13:50) |
подскажите, как мне прикрутить функцию ruslat |
В этом же и суть вопроса, вставить функцию я могу , а вот как вызвать - не знаю.
Спустя 1 минута, 48 секунд (13.06.2012 - 17:04) Invis1ble написал(а):
Функцию не смотрел, но если там все норм, то так:
<?php
set_time_limit(0);
$filename = '1.txt';
$file = file_get_contents($filename);
file_put_contents('2.txt', ruslat($file));
Спустя 7 минут, 12 секунд (13.06.2012 - 17:11) dron4ik написал(а):
$file = file_get_contents($filename);
$file = ruslat($file);
file_put_contents('2.txt', $file);
Только хз что получится)))))
$file = ruslat($file);
file_put_contents('2.txt', $file);
Только хз что получится)))))
Спустя 28 минут, 29 секунд (13.06.2012 - 17:40) medvedeva написал(а):
Invis1ble
dron4ik
Ребята, спасибо огромное, но похоже с функцией не всё ОК :huh:
Запустила скрипт, стравив его на небольшой текстовый файл для тестирования:
По итогам он заменил в русских словах латинские буквы на русские, а вот с английскими словами ничего не произошло, скрипт несколько раз выругался:
В 48й строчке это:
Как бы выборка английских слов с русскими буквами, но странно, ведь 52 строка почти такая же:
но на неё у интерпретатора никаких нареканий не возникло.
Прошу вас, господа программисты, подскажите, что же не так теперь в этой функции? :ph34r:
dron4ik
Ребята, спасибо огромное, но похоже с функцией не всё ОК :huh:
Запустила скрипт, стравив его на небольшой текстовый файл для тестирования:
<?php
set_time_limit(0);
$filename = '1.txt';
$file = file_get_contents($filename);
// Замена графически похожих латинских букв на русские буквы в русских словах и наоборот
function ruslat ($text)
{
// Соответствие букв русского и латинского алфавита
$abc = array(
"a" => "а",
"A" => "А",
"c" => "с",
"C" => "С",
"e" => "е",
"E" => "Е",
"T" => "Т",
"H" => "Н",
"o" => "о",
"O" => "О",
"p" => "р",
"P" => "Р",
"k" => "к",
"K" => "К",
"x" => "х",
"X" => "Х",
"B" => "В",
"M" => "М",
"b" => "ь",
"r" => "г",
"y" => "у",
"Y" => "У"
);
// Незаменимые русские символы
$russian = "шщфыджэячибю";
// Незаменимые латинские символы
$latin = "qwisdfgjzv";
// Строка с результатом
$result = "";
// Разбиваем текст на слова и работаем с каждым словом
$words = split(" ", $text);
foreach ($words as $word) {
if (!preg_match("#***91;$latin***93;+#i", $word)) {
foreach ($abc as $lat => $rus) {
$word = str_replace($lat, $rus, $word);
}
} elseif (!preg_match("#***91;$russian***93;+#i", $word)) {
foreach ($abc as $lat => $rus) {
$word = str_replace($rus, $lat, $word);
}
}
$result .= $word." ";
}
return trim($result);
}
file_put_contents('22.txt', ruslat($file));
?>
По итогам он заменил в русских словах латинские буквы на русские, а вот с английскими словами ничего не произошло, скрипт несколько раз выругался:
Warning: preg_match() [function.preg-match]: Compilation failed: nothing to repeat at offset 0 in U:\home\localhost\www\s\index.php on line 48
...
Warning: preg_match() [function.preg-match]: Compilation failed: nothing to repeat at offset 0 in U:\home\localhost\www\s\index.php on line 48
В 48й строчке это:
if (!preg_match("#***91;$latin***93;+#i", $word)) {
Как бы выборка английских слов с русскими буквами, но странно, ведь 52 строка почти такая же:
} elseif (!preg_match("#***91;$russian***93;+#i", $word)) {
но на неё у интерпретатора никаких нареканий не возникло.
Прошу вас, господа программисты, подскажите, что же не так теперь в этой функции? :ph34r:
Спустя 12 минут, 10 секунд (13.06.2012 - 17:52) Invis1ble написал(а):
Цитата |
Warning: preg_match() [function.preg-match]: Compilation failed: nothing to repeat at offset 0 in U:\home\localhost\www\s\index.php on line 48 |
Регулярки кривые.
Вообще, написать нужную тебе ф-цию не просто, ибо нет четких критериев, как распознать очередное слово в тексте - как английское или русское.
Спустя 4 минуты, 2 секунды (13.06.2012 - 17:56) Invis1ble написал(а):
так попробуй, но это не панацея
function ruslat ($text)
{
// Соответствие букв русского и латинского алфавита
$abc = array(
"a" => "а",
"A" => "А",
"c" => "с",
"C" => "С",
"e" => "е",
"E" => "Е",
"T" => "Т",
"H" => "Н",
"o" => "о",
"O" => "О",
"p" => "р",
"P" => "Р",
"k" => "к",
"K" => "К",
"x" => "х",
"X" => "Х",
"B" => "В",
"M" => "М",
"b" => "ь",
"r" => "г",
"y" => "у",
"Y" => "У"
);
// Строка с результатом
$result = "";
// Разбиваем текст на слова и работаем с каждым словом
$words = explode(" ", $text);
foreach ($words as $word) {
if (!preg_match("#[qwisdfgjzv]+#i", $word)) {
foreach ($abc as $lat => $rus) {
$word = str_replace($lat, $rus, $word);
}
} elseif (!preg_match("#[шщфыджэячибю]+#i", $word)) {
foreach ($abc as $lat => $rus) {
$word = str_replace($rus, $lat, $word);
}
}
$result .= $word." ";
}
return trim($result);
}
Спустя 8 минут, 44 секунды (13.06.2012 - 18:05) medvedeva написал(а):
Invis1ble
:o
:o
Цитата (Invis1ble @ 13.06.2012 - 14:52) |
Регулярки кривые. |
Ох уж эти регулярные выражения, познакомилась сегодня с ними, делала замены в тексте с их помощью... Но непонятно, почему русские слова с латинскими буквами скрипт "скушал", "переварил" и "...", а вот английские слова с русскими буквами не захотел, ведь выражения же идентичны:
!preg_match("#***91;$latin***93;+#i", $word)
и
!preg_match("#***91;$russian***93;+#i", $word)
Цитата (Invis1ble @ 13.06.2012 - 14:52) |
Вообще, написать нужную тебе ф-цию не просто, ибо нет четких критериев, как распознать очередное слово в тексте - как английское или русское. |
Ну почему же, есть критерий, если в слове встречаются буквы "qwisdfgjzv" - оно англ., если "шщфыджэячибю" - рус. Правда я еще думала, что же будет с такими словами, как например "МАМА" или "КОКОС".
Может быть кто-то знает, как эту функцию поправить? Была бы чрезмерно благодарна ;) Готова вознаградить доброго ГУРУ услугой дизайна или рерайта, ну или бэклинком каким-то... ;)
Спустя 5 минут, 54 секунды (13.06.2012 - 18:11) Invis1ble написал(а):
medvedeva
Цитата |
Правда я еще думала, что же будет с такими словами, как например "МАМА" или "КОКОС". |
отож, я подобные случаи и имел ввиду
Цитата |
Может быть кто-то знает, как эту функцию поправить? |
пробуй код из моего предыдущего поста
Спустя 4 минуты, 29 секунд (13.06.2012 - 18:15) johniek_comp написал(а):
medvedeva
у меня один вопрос, на аватарке ты?
у меня один вопрос, на аватарке ты?
Спустя 7 минут, 58 секунд (13.06.2012 - 18:23) medvedeva написал(а):
Цитата (Invis1ble @ 13.06.2012 - 15:11) |
пробуй код из моего предыдущего поста |
Invis1ble Спасибо, попробовала, с маленьким тестовым текстом скрипт справился, а натравила его на 8мб текста с тэгами - беда произошла, скрипт "покушал" BR теги, и подавился ими, выплюнув "<ьг/> <ьг/>".
Текст очень сильно пострадал хнык-хнык... Встречаются ужасные моменты, вроде "Ваггаск" или "Ypoвeнb", причем текст "побился" выборочно, примерно половина BR побились, довольно много английских слов, и немного, но при большом объеме вполне достаточно, русских.
Что же делать, как же быть?! Выручайте, господа, за мной не заржавеет
johniek_comp Да, моё хобби - фотография, мявк!
PS: Я тут приметила, что картинка в шапке форума немного не по теме, там на заднем фоне HTML код да еще и древний какой-то, а форум ведь о PHP, вот и готова в лучшем виде исправить это недоразумение с разрешения администратора главного
Спустя 7 минут, 3 секунды (13.06.2012 - 18:30) Invis1ble написал(а):
Тут дело попахивает мини-парсером html, я пас, мне лень
Может кто-то другой заморочится и поможет
Может кто-то другой заморочится и поможет
Спустя 6 минут, 22 секунды (13.06.2012 - 18:37) medvedeva написал(а):
Invis1ble А если упростить задачу, и убрать все HTML коды, оставить только переносы строки "\n", легче от этого не будет? Может быть дело в жадности регулярного выражения, я уже с этим сталкивалась сегодня, хотя непохоже на то, ведь текст "побился" как-то хаотично, довольно долго вникала, пытаясь обнаружить хоть какую-то последовательность - безрезультатно.
Спустя 5 минут, 15 секунд (13.06.2012 - 18:42) Invis1ble написал(а):
А текст в файле в какой кодировке? utf-8 ?
Спустя 41 минута, 41 секунда (13.06.2012 - 19:24) medvedeva написал(а):
Invis1ble Нет, в ANSI.
Спустя 2 часа, 43 минуты, 25 секунд (13.06.2012 - 22:07) killer8080 написал(а):
medvedeva
Функцию на помойку, какой то бредовый алгоритм. Проверку нужно делать на наличие латиницы и кириллицы в одном слове. Проблема в том, как определить принадлежность слова к одному из языков. Тут словарь будет нужен, лучше обучаемый. Полностью автомата не получиться.
Плюс грузить много мегабайтные файлы в оперативу, а потом еще и регулярками лопатить, накладно как то. Есть вероятность поймать PHP Fatal error: Allowed memory size of ... bytes exhausted.
Лучше наверно текст читать, и обрабатывать построчно.
Функцию на помойку, какой то бредовый алгоритм. Проверку нужно делать на наличие латиницы и кириллицы в одном слове. Проблема в том, как определить принадлежность слова к одному из языков. Тут словарь будет нужен, лучше обучаемый. Полностью автомата не получиться.
Плюс грузить много мегабайтные файлы в оперативу, а потом еще и регулярками лопатить, накладно как то. Есть вероятность поймать PHP Fatal error: Allowed memory size of ... bytes exhausted.
Лучше наверно текст читать, и обрабатывать построчно.
Спустя 22 минуты, 21 секунда (13.06.2012 - 22:29) redreem написал(а):
killer8080
+1 без словаря явно есть большая вероятность казуса.
+1 без словаря явно есть большая вероятность казуса.
Спустя 3 часа, 6 минут, 52 секунды (14.06.2012 - 01:36) FatCat написал(а):
Цитата (medvedeva @ 13.06.2012 - 19:05) |
Ох уж эти регулярные выражения |
Можно и без них.
Кстати, иногда грамотеи после знаков препинания точек не ставят, может получиться совсем белиберда на регулярках...
Наприметр "Фoтoaппapaт фиpмы,Nikоn" - жирным выделил символы неродного языка для этих слов.
Цитата (redreem @ 13.06.2012 - 23:29) |
без словаря явно есть большая вероятность казуса |
Казусы можно на дисплей выводить, чтобы можно было отлаживать скрипт.
Вот, попробовал написать, вроде работает:
$txt = "Фoтoaппapaт фиpмы,Nikоn";
$result = ""; // переменная для сбора исправленного текста
$tmp = ""; // "буфер" для целых слов
$stop = array(" ", ".", ",", "!", "?", "%", "@"); // символы конца слова.
$russian = explode(" ","ш щ ф ы д ж э я ч и б ю"); // массив незаменимых русских букв
$latin = explode(" ","q w i s d f g j z v"); // массив незаменимых английских букв
$abc = array(
"a" => "а",
"A" => "А",
"c" => "с",
"C" => "С",
"e" => "е",
"E" => "Е",
"T" => "Т",
"H" => "Н",
"o" => "о",
"O" => "О",
"p" => "р",
"P" => "Р",
"k" => "к",
"K" => "К",
"x" => "х",
"X" => "Х",
"B" => "В",
"M" => "М",
"b" => "ь",
"r" => "г",
"y" => "у",
"Y" => "У"
); // массив lat => рус
while($txt)
{
// Перемещаем по букве в буфер
$chr = substr($txt,0,1);
$tmp .= $chr;
$txt = substr($txt,1);
if( in_array($chr,$stop) or !$txt ) // уперлись в конец слова, в буфере целое слово.
{
// Пытаемся определить язык:
$lat = FALSE;
$rus = FALSE;
foreach($russian as $v)if(stristr($tmp,$v))$rus = TRUE;
foreach($latin as $v)if(stristr($tmp,$v))$lat = TRUE;
if($rus and $lat) // Язык слова не определен
echo "Не удалось определить язык слова «<strong>".strip_tags($tmp)."</strong>»<br>".PHP_EOL;
elseif($rus) // русское слово
foreach ($abc as $lat=>$rus)$tmp = str_replace($lat,$rus,$tmp); // переводим нерусские символы в русские
elseif($lat) // нерусское слово
foreach ($abc as $lat=>$rus)$tmp = str_replace($rus,$lat,$tmp); // переводим русские символы в нерусские
// переносим из буфера исправленное слово.
$result .= $tmp;
$tmp = "";
flush();
}
}
print $result;
Спустя 4 минуты, 43 секунды (14.06.2012 - 01:41) neadekvat написал(а):
FatCat
Зануда mode
Вместо самих кавычек-елочек лучше писать их html-коды, чтобы избежать фейлов в отображении.
Спустя 1 час, 12 минут, 7 секунд (14.06.2012 - 02:53) FatCat написал(а):
Цитата (neadekvat @ 14.06.2012 - 02:41) |
лучше писать их html-коды |
У нас на форуме настроено преобразование таким образом, что одиночная кавычка, восклицательный знак и еще несколько символов принимаются только метасимволами, а все остальные наоборот, только символами. Иначе вылезает куча других проблем.
& #187; - то же самое без пробела: »
& amp;#187; - »
& amp;& #35;187; - »
Спустя 19 минут, 45 секунд (14.06.2012 - 03:13) neadekvat написал(а):
FatCat, а вот теперь я вспомнил, что у меня никогда не получалось заставить отобразиться здесь html-представлению елочек, да.
Спустя 29 минут, 18 секунд (14.06.2012 - 03:42) medvedeva написал(а):
killer8080
redreem
Ребят, смутно, но представляю себе о чем Вы. Мне же не для сервера скрипт нужен, а для localhost.
FatCat Мяяявк!
redreem
Ребят, смутно, но представляю себе о чем Вы. Мне же не для сервера скрипт нужен, а для localhost.
FatCat Мяяявк!
Цитата (FatCat @ 13.06.2012 - 22:36) |
Казусы можно на дисплей выводить, чтобы можно было отлаживать скрипт. |
Безусловно, казусы можно и ручками поправить. Я бы и весь текст руками обработала, просто нет удобного инструмента для поиска "битых" слов
Цитата (FatCat @ 13.06.2012 - 22:36) |
Вот, попробовал написать, вроде работает: |
FatCat Мяяявк-мявк-мявк, спасибище огромное! Протестировала на коротком тексте - всё гуд, сейчас стравила скрипт на 8 метров текста, уже полчаса пыхтит, памяти почти не кушает, а вот камушек поднагрелся основательно. С нетерпением жду завершения операции, дабы узрить выходной текст.
Спустя 4 минуты, 7 секунд (14.06.2012 - 03:46) SitnikovArtur написал(а):
Перечитав пару раз топик, я пришел к выводу, что ну очень большая вероятность, что человек создавший тему не "девушка, познакомившаяся с php восемь часов назад, которая курит маны, запускает на денвере !preg_match(...), в ANSI кодировке, приводит ошибки выполнения интерпретатором 48 строки кода и вообще, предполагает, что дело может быть в 'жадности' регулярных выражений". Предыдущий пост вообще супер
Спустя 1 минута, 20 секунд (14.06.2012 - 03:47) walerus написал(а):
Как вариант, если без словаря, можно попробовать просчитывать процентное соотношение букв (рус/англ) в слове и менять слово в большую сторону, со словом "мама", конечно будут трудности, но их можно допустим подсвечивать иным цветом, для дальнейшей корректировки.
Анастасия, прикрепите какой нибудь файл( прикреплять файл через, предварительный просмотр ), с неправильным текстом, попробуем над ним поиздеваться
Анастасия, прикрепите какой нибудь файл( прикреплять файл через, предварительный просмотр ), с неправильным текстом, попробуем над ним поиздеваться
Спустя 5 минут, 22 секунды (14.06.2012 - 03:53) GET написал(а):
Цитата |
Перечитав пару раз топик, я пришел к выводу |
а аватрка рыженькой девушки с котэ в руках - вообще 100% попадание, просто не оставляет шансов быть не услышанной!
Хотя дело и не в этом, этот форум для этого и нужен, чтоб помогать друг другу.
Спустя 1 минута, 25 секунд (14.06.2012 - 03:54) walerus написал(а):
SitnikovArtur да, ты прав, Анастасия - оказалась не совсем Настенькой, тут она Кристина почему то , вот так всегда "не на*бешь - не проживешь"...
A.B.C. тоже верно, если бы код не показал/а бы, процент людей отписавшихся, был бы гораздо меньше )
A.B.C. тоже верно, если бы код не показал/а бы, процент людей отписавшихся, был бы гораздо меньше )
Спустя 24 минуты, 5 секунд (14.06.2012 - 04:18) medvedeva написал(а):
SitnikovArtur
Не раз сталкивалась в сети с подобным, и всегда почему-то пыталась объяснять людям, вот и сейчас попробую изложить =)
С PHP я конечно сталкивалась и до этого, но только на уровне правки внутри PHP файлов HTML кода, остальное для меня почти что тёмный лес, если не брать школьный курс бэйсика, из которого помню только print, load, randomize :lol:
Маны я курить приучилась, когда работала в техподдержке провайдера, там вокруг на 100 метров виндой не пахло, вот и приходилось "курить" на пользу удобству работы.
Не знаю, что такого в запуске preg_match на Denwere, но подозреваю, что ничего страшного и плохого, тем более что не я этот preg_match в в кривую функцию вставила.
ANSI вызвана тем, что оригинал текста, местами, очень старый, еще со времён DOS'а и Lexicon'а.
Об ошибках, с выводимым номером строки знаю не по наслышке, ибо часто правила HTML в PHP, давно еще, и постоянно эти ошибки возникали, в основном, когда забывала экранировать кавычки.
Ну а предположение о жадности регулярки возникло исходя из сегодняшнего опыта по замене некоторых участком текста с помощью регулярок, текст был примерно таким:
[shadow=примерно таким:]
Пыталась регулярками выделить часть внутри разделителей, чтобы заменить, делала это в Notepad++, так вот долго не могла понять, почему выделялся текст между первым и последним разделителем, но почитав о регулярных выражениях, узнала о их параметрах жадности, и дописав "?" к ".*", добилась нужного результата.
Да и вообще я "тёртый калач", первое знакомство с компьютером было еще в детдоме, директор наш был радиолюбителем. Как сейчас помню PK-86, кассетный магнитофон, и игры и монохромной ASCII графикой, типа змейки, пэкмэна, тэтриса. Потом "ZX Spectrum" (Sinclair), немного познее "Поиск"... Вспоминаются очереди в игровой класс, где стоял один комп, а пускали нас по 3 человека, и единственное во что можно было играть втроём за одним компом - King's Bounty :lol: До чего же захватывала эта игра)))
Ну а потом FIDO, нодой я конечно не была, может быть потому что пива пью мало, но почетным поинтом меня можно было смело считать, ночную BBS'ку запустила, эхи многие читала, осноной траффик был MP3'шки, которые нужно было из UUE декодить :P
A.B.C. Кристина - псевдоним, так мою дочь зовут :)
[shadow=Проследим цепочку:]
http://www.blogger.com/profile/15569644982617138034
http://heroes-mm.blogspot.com/
http://heroes.okis.ru/
http://heroes.okis.ru/opisanie_homm3.html (смотрим подпись)
Автор обзора: Анастасия Виллисс
Главный редактор сайта "Геройский Портал"
[/shadow]
PS: переживаю, вдруг бан за флуд получу :ph34r:
Не раз сталкивалась в сети с подобным, и всегда почему-то пыталась объяснять людям, вот и сейчас попробую изложить =)
С PHP я конечно сталкивалась и до этого, но только на уровне правки внутри PHP файлов HTML кода, остальное для меня почти что тёмный лес, если не брать школьный курс бэйсика, из которого помню только print, load, randomize :lol:
Маны я курить приучилась, когда работала в техподдержке провайдера, там вокруг на 100 метров виндой не пахло, вот и приходилось "курить" на пользу удобству работы.
Не знаю, что такого в запуске preg_match на Denwere, но подозреваю, что ничего страшного и плохого, тем более что не я этот preg_match в в кривую функцию вставила.
ANSI вызвана тем, что оригинал текста, местами, очень старый, еще со времён DOS'а и Lexicon'а.
Об ошибках, с выводимым номером строки знаю не по наслышке, ибо часто правила HTML в PHP, давно еще, и постоянно эти ошибки возникали, в основном, когда забывала экранировать кавычки.
Ну а предположение о жадности регулярки возникло исходя из сегодняшнего опыта по замене некоторых участком текста с помощью регулярок, текст был примерно таким:
[shadow=примерно таким:]
!!!!!!!!!!!!!!!!!![/shadow]
заголовок
текст
!!!!!!!!!!!!!!!!!!!!!!!!!!!
...
...
!!!!!!!!!!!!!!!!!!!!!!!!!!!
Пыталась регулярками выделить часть внутри разделителей, чтобы заменить, делала это в Notepad++, так вот долго не могла понять, почему выделялся текст между первым и последним разделителем, но почитав о регулярных выражениях, узнала о их параметрах жадности, и дописав "?" к ".*", добилась нужного результата.
Да и вообще я "тёртый калач", первое знакомство с компьютером было еще в детдоме, директор наш был радиолюбителем. Как сейчас помню PK-86, кассетный магнитофон, и игры и монохромной ASCII графикой, типа змейки, пэкмэна, тэтриса. Потом "ZX Spectrum" (Sinclair), немного познее "Поиск"... Вспоминаются очереди в игровой класс, где стоял один комп, а пускали нас по 3 человека, и единственное во что можно было играть втроём за одним компом - King's Bounty :lol: До чего же захватывала эта игра)))
Ну а потом FIDO, нодой я конечно не была, может быть потому что пива пью мало, но почетным поинтом меня можно было смело считать, ночную BBS'ку запустила, эхи многие читала, осноной траффик был MP3'шки, которые нужно было из UUE декодить :P
A.B.C. Кристина - псевдоним, так мою дочь зовут :)
[shadow=Проследим цепочку:]
http://www.blogger.com/profile/15569644982617138034
http://heroes-mm.blogspot.com/
http://heroes.okis.ru/
http://heroes.okis.ru/opisanie_homm3.html (смотрим подпись)
Автор обзора: Анастасия Виллисс
Главный редактор сайта "Геройский Портал"
[/shadow]
PS: переживаю, вдруг бан за флуд получу :ph34r:
Спустя 15 минут, 24 секунды (14.06.2012 - 04:34) medvedeva написал(а):
walerus
Запроста, вот мой тестовый файлик:
Запроста, вот мой тестовый файлик:
Спустя 10 минут, 31 секунда (14.06.2012 - 04:44) FatCat написал(а):
Цитата (SitnikovArtur @ 14.06.2012 - 04:46) |
очень большая вероятность, что человек создавший тему не "девушка |
Я перерос возраст падкости на девушек, у меня дети старше лица на аватарке.
А котейко растрогал, он совсем не испуган, даже уши не развернул; за одну такую аватарку хочется помогать.
Спустя 9 минут, 54 секунды (14.06.2012 - 04:54) medvedeva написал(а):
FatCat
Цитата (FatCat @ 14.06.2012 - 01:44) |
А котейко растрогал, он совсем не испуган, даже уши не развернул; за одну такую аватарку хочется помогать. |
Котейка горный, это когда Карпаты посещала с семьей, не удержалась, чтобы не сфотогрфироваться с этим милым хозяйским котегом по имени Спрут. А вот и мой зверюга, зовут Кореш.
http://s019.radikal.ru/i615/1206/88/f2f8ba0abcaa.jpg
http://s011.radikal.ru/i315/1206/7d/9f7295f64324.jpg
Он еще совсем мелким котейкой был, зимой забрался под капот к тёплому двигателю, на улице -25 было, пришлось с мужем машину в гараж со двора закатывать вручную, ибо достать или выманить Корешка не могли, только потом в тёплом гараже он вышел к миске с молоком. Первое время очень боялся людей, и когда кушал или пил, постоянно "рычал", шерсть дыбом ставил.
PS: вот еще бравый котэ http://s016.radikal.ru/i334/1206/5a/ce8c7ae3db96.jpg
PS2: баном пахнет
Спустя 26 минут, 50 секунд (14.06.2012 - 05:21) GET написал(а):
Цитата |
FatCat Мяяявк-мявк-мявк, спасибище огромное! Протестировала на коротком тексте - всё гуд, сейчас стравила скрипт на 8 метров текста, уже полчаса пыхтит, памяти почти не кушает, а вот камушек поднагрелся основательно. С нетерпением жду завершения операции, дабы узрить выходной текст. |
Я так и не понял переработал скрипт FatCat'a этот основной текст или нет?
Спустя 18 секунд (14.06.2012 - 05:21) walerus написал(а):
medvedeva Ок, за файлег спасибо ), на счет фотки и имени - это я "запереживал", а не A.B.C, если дочь - то хорошо ), тогда как с этим быть? тыц не ужели SEO ход? )))
FatCat - Да многие переросли этот возраст, но ничего зазорного в этом я не вижу, если есть на "что" посмотреть, почему нет?...
P.S. - Фото в студию ! ), на фоне PHP форума и этого топика
FatCat - Да многие переросли этот возраст, но ничего зазорного в этом я не вижу, если есть на "что" посмотреть, почему нет?...
P.S. - Фото в студию ! ), на фоне PHP форума и этого топика
Спустя 24 минуты, 18 секунд (14.06.2012 - 05:46) medvedeva написал(а):
Цитата (A.B.C. @ 14.06.2012 - 02:21) |
Я так и не понял переработал скрипт FatCat'a этот основной текст или нет? |
A.B.C. Перерабатывает, около 10% только переработано, вывод результатов в файл у меня не получилось реализовать, поэтому результата пока что не видно
Цитата (walerus @ 14.06.2012 - 02:21) |
тогда как с этим быть? тыц не ужели SEO ход? |
walerus Хммм!!! "Это что за новости!" Вот негодяи, стыбрили фотку, еще и подписали ужасно "Zeynep 25 Yaşında, Uşak’da Yaşıyor.", буковки какие-то ненашенские - МЕРЗАВЦЫ одним словом.
Цитата (walerus @ 14.06.2012 - 02:21) |
P.S. - Фото в студию ! ), на фоне PHP форума и этого топика |
Я не собираюсь никому ничего доказывать. Хотите фото? - да пожалуйста, только без позирования на различных фонах или с бумажками с надписями Как у фотографа, у меня есть свои принципы, один из них не фотографироваться для кого-то. Еще никогда не фотографируюсь с различной техникой, исключением только раритеты являются.
http://i081.radikal.ru/1206/55/d5558c00969f.jpg
http://s013.radikal.ru/i322/1206/6e/49459f873438.jpg
http://s017.radikal.ru/i404/1206/62/72efb068f766.jpg
http://s59.radikal.ru/i166/1206/55/b0ae5276d5dd.jpg
http://s017.radikal.ru/i404/1206/a9/6cd2199c5d64.jpg
http://s008.radikal.ru/i305/1206/29/6a6cbb0628b4.jpg
http://s019.radikal.ru/i611/1206/18/f68aa2afc256.jpg
PS: двойственное чувство возникло, когда увидела себя на каком-то "левом" сайте, с одной стороны злюсь, а с другой стороны популярная персона значит, раз забугор утекла фотка Из перевода страницы "О сайте": http://clip2net.com/s/21ZJs поняла, что это блоггер какой-то турецкий, выкладывает в блог понравившиеся фотки и видео))
Спустя 3 часа, 1 минута, 20 секунд (14.06.2012 - 08:47) redreem написал(а):
medvedeva
не ведитесь на разводы местные любят поизмываться, поподдевывать, порассматривать под микроскопом, только повод дай профессионализм прежде всего
не ведитесь на разводы местные любят поизмываться, поподдевывать, порассматривать под микроскопом, только повод дай профессионализм прежде всего
Спустя 6 минут, 51 секунда (14.06.2012 - 08:54) redreem написал(а):
мысля кстати пришла - это ж типичная задачка криптографии. татары явно не ручками плохие буквы набивали... конечно все зависит от того сколько таких текстов надо исправить. если до пару сотен тысяч символов - можно и ручками поправить - если больше - то имеет смысл подключать словари и всякий там статанализ врубать уже. я думаю написать автомат можно за 2-3 дня.
Спустя 1 час, 25 минут, 27 секунд (14.06.2012 - 10:19) walerus написал(а):
Фотки порадовали ! , предлагаю сделать раздел - "Мои фотки" ))), - вот оно, будущее поколение PHP кодеров )... где такие трудятся???... на что фоткали то? )
p.s. Задачка и правда интересная, будем пробовать решать ).
p.s. Задачка и правда интересная, будем пробовать решать ).
Спустя 2 часа, 3 минуты, 31 секунда (14.06.2012 - 12:23) YVSIK написал(а):
medvedeva
Стоп стоп СТОП-СТОП!!
вам сюда надо, сюда!
там и представиться по полной, инцидентов достаточно, тут девчата самыра НУ очень нужны
и познакомиться не грех!
Стоп стоп СТОП-СТОП!!
вам сюда надо, сюда!
там и представиться по полной, инцидентов достаточно, тут девчата самыра НУ очень нужны
и познакомиться не грех!
Спустя 1 час, 36 минут, 54 секунды (14.06.2012 - 14:00) medvedeva написал(а):
redreem та я спокойно к этому отношусь, ибо по жизни вся такая уравновешенная, шахматами увлекаюсь
walerus спасибо) В Киеве. Фото сделаны на EOS 400D c EF 55 200. Не знаю насчет будущего, но PHP давно мну манит своими безграничными возможностями для разработки веб-приложений, может и научусь, в планах серьезный веб-проект запустить, некий информационный портал с около энциклопедическими, местами псевдонаучными, статьями на различные темы, а там задачи по программированию на PHP точно возникнут, вот тогда не откручусь, просто придётся научиться, а пока азы осваиваю, начала читать "PHP в примерах".
YVSIK благодарствую, но я еще не обжилась, немного стесняюсь
FatCat Скриптик, с усовершенствованной Вами функцией, всё еще перерабатывает текст, камушек P4, а алгоритм поиска и замены сложный, жду пока он закончит.
walerus спасибо) В Киеве. Фото сделаны на EOS 400D c EF 55 200. Не знаю насчет будущего, но PHP давно мну манит своими безграничными возможностями для разработки веб-приложений, может и научусь, в планах серьезный веб-проект запустить, некий информационный портал с около энциклопедическими, местами псевдонаучными, статьями на различные темы, а там задачи по программированию на PHP точно возникнут, вот тогда не откручусь, просто придётся научиться, а пока азы осваиваю, начала читать "PHP в примерах".
YVSIK благодарствую, но я еще не обжилась, немного стесняюсь
FatCat Скриптик, с усовершенствованной Вами функцией, всё еще перерабатывает текст, камушек P4, а алгоритм поиска и замены сложный, жду пока он закончит.
Спустя 48 минут, 19 секунд (14.06.2012 - 14:48) YVSIK написал(а):
medvedevaЭт на любителя
думаю что самый тот тлучай согласно адекватности вопросов и реагирования на ответы
тут такие приходят, такие вопросы задают ну вообщем есть тема для просвящения чем мы тут живём
а вот http://phpforum.ru/index.php?showtopic=55241&hl=
а это замечательная темка http://phpforum.ru/index.php?showtopic=37202
ну думаю что тебе она не гразит))
думаю что самый тот тлучай согласно адекватности вопросов и реагирования на ответы
тут такие приходят, такие вопросы задают ну вообщем есть тема для просвящения чем мы тут живём
а вот http://phpforum.ru/index.php?showtopic=55241&hl=
а это замечательная темка http://phpforum.ru/index.php?showtopic=37202
ну думаю что тебе она не гразит))
Спустя 12 минут, 11 секунд (14.06.2012 - 15:00) medvedeva написал(а):
YVSIK Хихи, шпаргалочку читала уже, суперская! Насчет радио, сразу вспомнилась отличная реализация http://radio.heroeswm.ru единственное что, при онлайне в 10к, радио слушают ~200-300, вот я, например, смогла бы слушать только в определённое время интересные передачи, ибо всё остальное время предпочитаю слушать музыку на качественной аккустике.
Спустя 4 часа, 2 минуты, 57 секунд (14.06.2012 - 19:03) walerus написал(а):
medvedeva Вот ! Супер, я на днях в Киев еду ), заеду в гости
Какой человек а? - Зёму слушает, да еще и любитель хорошей акустики ))
Какой человек а? - Зёму слушает, да еще и любитель хорошей акустики ))
Спустя 5 минут, 26 секунд (14.06.2012 - 19:09) medvedeva написал(а):
walerus На симпозиум директоров сайта Петросяна?)
PS: прошу прощения за флуд, настроение зашкаливающее... *ДиДюЛя - Поезд в Барселону*
PS: прошу прощения за флуд, настроение зашкаливающее... *ДиДюЛя - Поезд в Барселону*
Спустя 12 часов, 4 минуты, 2 секунды (15.06.2012 - 07:13) medvedeva написал(а):
FatCat скриптик закончил работу, результат выдался в браузер, настолько огромная страница получилось, что Мозила, бедненький, в конце текста уже не воспринимал HTML теги. Сохранила исходника, очистила в текстовом редакторе, и скажу так: "Вы просто чудо!!!". Несмотря на то, что скрипт трудился почти сутки, результат ошеломляющий!!! Обработал всё довольно неплохо, единственное что - "Англ.слово" (именно когда оно в кавычках) не обработал, а "Англ.слово англ.слово2 ... англсловоN" - отлично всё заменил.
Выборочно пострадали
Стали
Но это не беда, можно массовую замену произвести.
Еще в тексте встречаются обозначение кнопки табуляции, они тоже чутка пострадали, выборочно, вместо [Таb] стали [Таь], но и это легко поправимо массовой заменой. :)
Других казусов не удалось обнаружить с помощью замечательного софта для сравнения WinMerge, значит их и нет. Мявк-мявк-мявк, как я рада!!!
Теперь у меня вполне конкретный вопрос, можно ли модифицировать как-то эту функцию, чтобы она справилась с "Англ.слово" (именно когда оно в кавычках), тоесть как-то сузить поиск для замены по маске:
Между двойными кавычками только буквы, никаких спец.символов или пробелов.
Буду очень признательна за любую помощь.
Ниже привожу код FatCat'а, чтобы не искать его в теме между невинными флудопостами ;)
PS: странно форум с BB-кодами работает, не понимает, когда [CODE] внутни [SHADOW] :o
Выборочно пострадали
<br/> и </b>
Стали
<ьг/> и </ь>
Но это не беда, можно массовую замену произвести.
Еще в тексте встречаются обозначение кнопки табуляции, они тоже чутка пострадали, выборочно, вместо [Таb] стали [Таь], но и это легко поправимо массовой заменой. :)
Других казусов не удалось обнаружить с помощью замечательного софта для сравнения WinMerge, значит их и нет. Мявк-мявк-мявк, как я рада!!!
Теперь у меня вполне конкретный вопрос, можно ли модифицировать как-то эту функцию, чтобы она справилась с "Англ.слово" (именно когда оно в кавычках), тоесть как-то сузить поиск для замены по маске:
[ДВОЙНЫЕ_КАВЫЧКИ][ЛЮБАЯ_ПОСЛЕДОВАТЕЛЬНОСТЬ_ВСЕХ_РУС_и_ЛАТ_СИМВОЛОВ][ДВОЙНЫЕ_КАВЫЧКИ]
Между двойными кавычками только буквы, никаких спец.символов или пробелов.
Буду очень признательна за любую помощь.
Ниже привожу код FatCat'а, чтобы не искать его в теме между невинными флудопостами ;)
$txt = "Фoтoaппapaт фиpмы,Nikоn";
$result = ""; // переменная для сбора исправленного текста
$tmp = ""; // "буфер" для целых слов
$stop = array(" ", ".", ",", "!", "?", "%", "@"); // символы конца слова.
$russian = explode(" ","ш щ ф ы д ж э я ч и б ю"); // массив незаменимых русских букв
$latin = explode(" ","q w i s d f g j z v"); // массив незаменимых английских букв
$abc = array(
"a" => "а",
"A" => "А",
"c" => "с",
"C" => "С",
"e" => "е",
"E" => "Е",
"T" => "Т",
"H" => "Н",
"o" => "о",
"O" => "О",
"p" => "р",
"P" => "Р",
"k" => "к",
"K" => "К",
"x" => "х",
"X" => "Х",
"B" => "В",
"M" => "М",
"b" => "ь",
"r" => "г",
"y" => "у",
"Y" => "У"
); // массив lat => рус
while($txt)
{
// Перемещаем по букве в буфер
$chr = substr($txt,0,1);
$tmp .= $chr;
$txt = substr($txt,1);
if( in_array($chr,$stop) or !$txt ) // уперлись в конец слова, в буфере целое слово.
{
// Пытаемся определить язык:
$lat = FALSE;
$rus = FALSE;
foreach($russian as $v)if(stristr($tmp,$v))$rus = TRUE;
foreach($latin as $v)if(stristr($tmp,$v))$lat = TRUE;
if($rus and $lat) // Язык слова не определен
echo "Не удалось определить язык слова «<strong>".strip_tags($tmp)."</strong>»<br>".PHP_EOL;
elseif($rus) // русское слово
foreach ($abc as $lat=>$rus)$tmp = str_replace($lat,$rus,$tmp); // переводим нерусские символы в русские
elseif($lat) // нерусское слово
foreach ($abc as $lat=>$rus)$tmp = str_replace($rus,$lat,$tmp); // переводим русские символы в нерусские
// переносим из буфера исправленное слово.
$result .= $tmp;
$tmp = "";
flush();
}
}
print $result;
PS: странно форум с BB-кодами работает, не понимает, когда [CODE] внутни [SHADOW] :o
Спустя 12 часов, 39 минут, 6 секунд (15.06.2012 - 19:52) walerus написал(а):
medvedeva
Цитата |
walerus На симпозиум директоров сайта Петросяна?) |
Точно!, а от куда ты узнала про симпозиум? - тоже на нем будешь?
Спустя 6 часов, 12 секунд (16.06.2012 - 01:52) FatCat написал(а):
Цитата (medvedeva @ 15.06.2012 - 08:13) |
Выборочно пострадали |
Не сообразил сразу, что будет ХТМЛ, и внутри тегов не нужно обрабатывать.
Цитата (medvedeva @ 15.06.2012 - 08:13) |
как-то сузить поиск для замены по маске |
Модифицировать код, чтобы слова в кавычках тоже обрабатывал? Добавить символ кавычки в список стоп-символов: $stop = array(" ", ".", ",", "!", "?", "%", "@" ,"\"" );
Несколько сложней с исключением из проверки внутренностей ХТМЛ-тегов.
Вот вроде работает:
$txt = 'Этo <b>Hoвый</b> Фoтoaппapaт,фиpмы "Nikоn"';
$result = ""; // переменная для сбора исправленного текста
$tmp = ""; // "буфер" для целых слов
$stop = array(" ", ".", ",", "!", "?", "%", "@","\"","<",">"); // символы конца слова.
$russian = explode(" ","ш щ ф ы д ж э я ч и б ю"); // массив незаменимых русских букв
$latin = explode(" ","q w i s d f g j z v"); // массив незаменимых английских букв
$in_tag = FALSE; // метка попадания внутрь ХТМЛ-тега
$abc = array(
"a" => "а",
"A" => "А",
"c" => "с",
"C" => "С",
"e" => "е",
"E" => "Е",
"T" => "Т",
"H" => "Н",
"o" => "о",
"O" => "О",
"p" => "р",
"P" => "Р",
"k" => "к",
"K" => "К",
"x" => "х",
"X" => "Х",
"B" => "В",
"M" => "М",
"b" => "ь",
"r" => "г",
"y" => "у",
"Y" => "У"
); // массив lat => рус
while($txt)
{
// Перемещаем по букве в буфер
$chr = substr($txt,0,1);
$tmp .= $chr;
$txt = substr($txt,1);
if($in_tag and $chr == ">") // вышли из тега
{
$in_tag = FALSE;
$result .= $tmp;
$tmp = "";
}
if( in_array($chr,$stop) or !$txt ) // уперлись в конец слова, в буфере целое слово.
{
if(!$in_tag) // переводим только текст, внутри тегов не мучаемся
{
// Пытаемся определить язык:
$lat = FALSE;
$rus = FALSE;
foreach($russian as $v)if(stristr($tmp,$v))$rus = TRUE;
foreach($latin as $v)if(stristr($tmp,$v))$lat = TRUE;
if($rus and $lat) // Язык слова не определен
echo "Не удалось определить язык слова «<strong>".strip_tags($tmp)."</strong>»<br>".PHP_EOL;
elseif($rus) // русское слово
foreach ($abc as $lat=>$rus)$tmp = str_replace($lat,$rus,$tmp); // переводим нерусские символы в русские
elseif($lat) // нерусское слово
foreach ($abc as $lat=>$rus)$tmp = str_replace($rus,$lat,$tmp); // переводим русские символы в нерусские
}
// переносим из буфера исправленное слово.
$result .= $tmp;
$tmp = "";
}
if(!$in_tag and $chr == "<" and substr($txt,0,1) != " " and substr($txt,0,1) != PHP_EOL) // Вошли в тег
{
$in_tag = TRUE;
$result .= $tmp;
$tmp = "";
}
}
print $result;
Спустя 3 часа, 1 минута, 23 секунды (16.06.2012 - 04:53) medvedeva написал(а):
walerus все там будем, только попробуй не приедь))
FatCat Спасибки огромное, сейчас оформлю это в скрпит для обработки файла текстового, пускай обрабатывает, как раз выходные на даче проведу
Даже и не знаю как благодарить Вас, но обязательно что-то придумаю
FatCat Спасибки огромное, сейчас оформлю это в скрпит для обработки файла текстового, пускай обрабатывает, как раз выходные на даче проведу
Даже и не знаю как благодарить Вас, но обязательно что-то придумаю
Спустя 4 часа, 8 минут, 29 секунд (16.06.2012 - 09:02) twin написал(а):
Вот тут можно ускорить процесс чутка
foreach($russian as $v)
if(stristr($tmp,$v))
{
$rus = TRUE;
break;
}
foreach($latin as $v)
if(stristr($tmp,$v))
{
$lat = TRUE;
break;
}
Спустя 1 час, 51 минута, 28 секунд (16.06.2012 - 10:53) medvedeva написал(а):
twin Спасибочки, попробую сейчас
Спустя 3 часа, 8 минут, 14 секунд (16.06.2012 - 14:01) FatCat написал(а):
Цитата (twin @ 16.06.2012 - 10:02) |
можно ускорить процесс чутка |
Если обрабатываются большие тексты, можно сделать динамический словарь.
Слова до перевода сливать в массив $finded, и проверять по словарю прежде чем гонять переводчик:
$txt = 'Этo <b>Hoвый</b> Фoтoaппapaт,фиpмы "Nikоn"';
$result = ""; // переменная для сбора исправленного текста
$tmp = ""; // "буфер" для целых слов
$stop = array(" ", ".", ",", "!", "?", "%", "@","\"","<",">"); // символы конца слова.
$russian = explode(" ","ш щ ф ы д ж э я ч и б ю"); // массив незаменимых русских букв
$latin = explode(" ","q w i s d f g j z v"); // массив незаменимых английских букв
$in_tag = FALSE; // метка попадания внутрь ХТМЛ-тега
$finded = array(); // массив отработанных слов
$translated = array(); // словарь переводов
$abc = array(
"a" => "а",
"A" => "А",
"c" => "с",
"C" => "С",
"e" => "е",
"E" => "Е",
"T" => "Т",
"H" => "Н",
"o" => "о",
"O" => "О",
"p" => "р",
"P" => "Р",
"k" => "к",
"K" => "К",
"x" => "х",
"X" => "Х",
"B" => "В",
"M" => "М",
"b" => "ь",
"r" => "г",
"y" => "у",
"Y" => "У"
); // массив lat => рус
while($txt)
{
// Перемещаем по букве в буфер
$chr = substr($txt,0,1);
$tmp .= $chr;
$txt = substr($txt,1);
if($in_tag and $chr == ">") // вышли из тега
{
$in_tag = FALSE;
$result .= $tmp;
$tmp = "";
}
if( in_array($chr,$stop) or !$txt ) // уперлись в конец слова, в буфере целое слово.
{
if(!$in_tag) // переводим только текст, внутри тегов не мучаемся
{
if( !in_array($tmp, $finded) ) // Новое слово
{
//Пополняем поисковку по словарю
$finded[] = $tmp;
// Первеводим:
// Пытаемся определить язык:
$lat = FALSE;
$rus = FALSE;
foreach($russian as $v)if(stristr($tmp,$v)){$rus = TRUE;break;}
foreach($latin as $v)if(stristr($tmp,$v)){$lat = TRUE;break;}
if($rus and $lat) // Язык слова не определен
echo "Не удалось определить язык слова «<strong>".strip_tags($tmp)."</strong>»<br>".PHP_EOL;
elseif($rus) // русское слово
foreach ($abc as $lat=>$rus)$tmp = str_replace($lat,$rus,$tmp); // переводим нерусские символы в русские
elseif($lat) // нерусское слово
foreach ($abc as $lat=>$rus)$tmp = str_replace($rus,$lat,$tmp); // переводим русские символы в нерусские
// Пополняем словарь переводов:
$translated[ $finded[ (count($finded)-1) ] ] = $tmp;
}
else // Это слово уже переводили, берем из словаря
$tmp = $translated[ $tmp ];
}
// переносим из буфера исправленное слово.
$result .= $tmp;
$tmp = "";
}
if(!$in_tag and $chr == "<" and substr($txt,0,1) != " " and substr($txt,0,1) != PHP_EOL) // Вошли в тег
{
$in_tag = TRUE;
$result .= $tmp;
$tmp = "";
}
}
print $result;
Спустя 3 часа, 43 секунды (16.06.2012 - 17:02) twin написал(а):
FatCat
Я про другое. Совсем не обязательно гнать слово до конца, если уже определили, что оно русское/нерусское. Прервать цикл и вся недолга. Когда слов 8 метров, это может принести довольно ощутимый прирост скорости. А насчет словаря - я тоже взялся решать эту задачу. Именно со словарем. И стеммером. Именины подвели и ты опередил))) Но зато я словарь теперь имею - нет худа без добра.
PS Задача крайне интересная, что редкость. medvedeva, спасибо. Почаще таких "нубских" вопросов плиз))
Я про другое. Совсем не обязательно гнать слово до конца, если уже определили, что оно русское/нерусское. Прервать цикл и вся недолга. Когда слов 8 метров, это может принести довольно ощутимый прирост скорости. А насчет словаря - я тоже взялся решать эту задачу. Именно со словарем. И стеммером. Именины подвели и ты опередил))) Но зато я словарь теперь имею - нет худа без добра.
PS Задача крайне интересная, что редкость. medvedeva, спасибо. Почаще таких "нубских" вопросов плиз))
Спустя 5 часов, 2 минуты, 37 секунд (16.06.2012 - 22:05) FatCat написал(а):
Цитата (twin @ 16.06.2012 - 18:02) |
Я про другое. Совсем не обязательно гнать слово до конца, если уже определили |
Да, это я понял, и использовал.
Вообще, мне странно, что скрипт молотил сутки.
У меня похожая задача была распарсить в БД базу Пастухова: Есть строки поисковых запросов в алфавитном порядке, нужно ранжировать. Например, запрос "купить ботинки" является дочерним и запросу "купить", и запросу "ботинки".
Скрипт молотил сутки. Но там было 16 гигов.
А 8 метров, это вообще тьфу, это должно секунды отрабатывать, если только комп не свопит.
Спустя 6 часов, 47 минут, 12 секунд (17.06.2012 - 04:52) medvedeva написал(а):
Цитата (twin @ 16.06.2012 - 14:02) |
PS Задача крайне интересная, что редкость. medvedeva, спасибо. Почаще таких "нубских" вопросов плиз)) |
twin Вам спасибо, буду стараться.
Цитата (FatCat @ 16.06.2012 - 19:05) |
Вообще, мне странно, что скрипт молотил сутки. |
FatCat писала же, P4 у мну, да и я же в покое комп не оставляла, пока скрипт работал, то фотошоп, то еще что... Своп отключен, 4гб оперативки, WinXP+Denwer. Насколько я понимаю, та же задача, но не с текстовым файлом, а с мускуль базой была бы обработана скриптом ощутимо быстрее.
UPD:
Немного изменила:
$latin = explode(" ","q w i s d f g j z v");
на:
$latin = explode(" ","q w i s d f g j z v r l n");
т.к. в тексте нет замены русской "г" на латинскую "r", "l" и "n" тоже в русских словах не встречаются.
Соответственно убрала строку:
"r" => "г",
Запустила скрипт на переработку 8мб текста, внесла правки, позволяющие выводить результат не в браузер, а в другой файл, но к сожалению файл создастся только по окончании процесса, так что теперь только ждать остаётся :)
А вот и сам скрипт, который был запущен:
<?php
set_time_limit(0);
$filename = '1.txt';
$txt = file_get_contents($filename);
$result = ""; // переменная для сбора исправленного текста
$tmp = ""; // "буфер" для целых слов
$stop = array(" ", ".", ",", "!", "?", "%", "@","\"","<",">"); // символы конца слова.
$russian = explode(" ","ш щ ф ы д ж э я ч и б ю"); // массив незаменимых русских букв
$latin = explode(" ","q w i s d f g j z v r l n"); // массив незаменимых английских букв
$in_tag = FALSE; // метка попадания внутрь ХТМЛ-тега
$finded = array(); // массив отработанных слов
$translated = array(); // словарь переводов
$abc = array(
"a" => "а",
"A" => "А",
"c" => "с",
"C" => "С",
"e" => "е",
"E" => "Е",
"T" => "Т",
"H" => "Н",
"o" => "о",
"O" => "О",
"p" => "р",
"P" => "Р",
"k" => "к",
"K" => "К",
"x" => "х",
"X" => "Х",
"B" => "В",
"M" => "М",
"b" => "ь",
"y" => "у"
); // массив lat => рус
while($txt)
{
// Перемещаем по букве в буфер
$chr = substr($txt,0,1);
$tmp .= $chr;
$txt = substr($txt,1);
if($in_tag and $chr == ">") // вышли из тега
{
$in_tag = FALSE;
$result .= $tmp;
$tmp = "";
}
if( in_array($chr,$stop) or !$txt ) // уперлись в конец слова, в буфере целое слово.
{
if(!$in_tag) // переводим только текст, внутри тегов не мучаемся
{
if( !in_array($tmp, $finded) ) // Новое слово
{
//Пополняем поисковку по словарю
$finded[] = $tmp;
// Первеводим:
// Пытаемся определить язык:
$lat = FALSE;
$rus = FALSE;
foreach($russian as $v)if(stristr($tmp,$v)){$rus = TRUE;break;}
foreach($latin as $v)if(stristr($tmp,$v)){$lat = TRUE;break;}
if($rus and $lat) // Язык слова не определен
echo "Не удалось определить язык слова «<strong>".strip_tags($tmp)."</strong>»<br>".PHP_EOL;
elseif($rus) // русское слово
foreach ($abc as $lat=>$rus)$tmp = str_replace($lat,$rus,$tmp); // переводим нерусские символы в русские
elseif($lat) // нерусское слово
foreach ($abc as $lat=>$rus)$tmp = str_replace($rus,$lat,$tmp); // переводим русские символы в нерусские
// Пополняем словарь переводов:
$translated[ $finded[ (count($finded)-1) ] ] = $tmp;
}
else // Это слово уже переводили, берем из словаря
$tmp = $translated[ $tmp ];
}
// переносим из буфера исправленное слово.
$result .= $tmp;
$tmp = "";
}
if(!$in_tag and $chr == "<" and substr($txt,0,1) != " " and substr($txt,0,1) != PHP_EOL) // Вошли в тег
{
$in_tag = TRUE;
$result .= $tmp;
$tmp = "";
}
}
file_put_contents('22.txt', $result);
?>
Спустя 9 часов, 7 минут, 55 секунд (17.06.2012 - 14:00) FatCat написал(а):
Цитата (medvedeva @ 17.06.2012 - 05:52) |
к сожалению файл создастся только по окончании процесса, так что теперь только ждать остаётся :) |
Файл можно дописывать по ходу работы скрипта.
<?php
set_time_limit(0);
$filename = '1.txt';
$txt = file_get_contents($filename);
// $result = ""; // переменная для сбора исправленного текста больше нам не нужна, сразу дописываем в файл
$tmp = ""; // "буфер" для целых слов
$stop = array(" ", ".", ",", "!", "?", "%", "@","\"","<",">"); // символы конца слова.
$russian = explode(" ","ш щ ф ы д ж э я ч и б ю"); // массив незаменимых русских букв
$latin = explode(" ","q w i s d f g j z v r l n"); // массив незаменимых английских букв
$in_tag = FALSE; // метка попадания внутрь ХТМЛ-тега
$finded = array(); // массив отработанных слов
$translated = array(); // словарь переводов
$abc = array(
"a" => "а",
"A" => "А",
"c" => "с",
"C" => "С",
"e" => "е",
"E" => "Е",
"T" => "Т",
"H" => "Н",
"o" => "о",
"O" => "О",
"p" => "р",
"P" => "Р",
"k" => "к",
"K" => "К",
"x" => "х",
"X" => "Х",
"B" => "В",
"M" => "М",
"b" => "ь",
"y" => "у"
); // массив lat => рус
while($txt)
{
// Перемещаем по букве в буфер
$chr = substr($txt,0,1);
$tmp .= $chr;
$txt = substr($txt,1);
if($in_tag and $chr == ">") // вышли из тега
{
$in_tag = FALSE;
$fh = fopen('22.txt', "a");
fwrite($fh, $tmp);
fclose($fh);
$tmp = "";
}
if( in_array($chr,$stop) or !$txt ) // уперлись в конец слова, в буфере целое слово.
{
if(!$in_tag) // переводим только текст, внутри тегов не мучаемся
{
if( !in_array($tmp, $finded) ) // Новое слово
{
//Пополняем поисковку по словарю
$finded[] = $tmp;
// Первеводим:
// Пытаемся определить язык:
$lat = FALSE;
$rus = FALSE;
foreach($russian as $v)if(stristr($tmp,$v)){$rus = TRUE;break;}
foreach($latin as $v)if(stristr($tmp,$v)){$lat = TRUE;break;}
if($rus and $lat) // Язык слова не определен
echo "Не удалось определить язык слова «<strong>".strip_tags($tmp)."</strong>»<br>".PHP_EOL;
elseif($rus) // русское слово
foreach ($abc as $lat=>$rus)$tmp = str_replace($lat,$rus,$tmp); // переводим нерусские символы в русские
elseif($lat) // нерусское слово
foreach ($abc as $lat=>$rus)$tmp = str_replace($rus,$lat,$tmp); // переводим русские символы в нерусские
// Пополняем словарь переводов:
$translated[ $finded[ (count($finded)-1) ] ] = $tmp;
}
else // Это слово уже переводили, берем из словаря
$tmp = $translated[ $tmp ];
}
// переносим из буфера исправленное слово.
$fh = fopen('22.txt', "a");
fwrite($fh, $tmp);
fclose($fh);
$tmp = "";
}
if(!$in_tag and $chr == "<" and substr($txt,0,1) != " " and substr($txt,0,1) != PHP_EOL) // Вошли в тег
{
$in_tag = TRUE;
$fh = fopen('22.txt', "a");
fwrite($fh, $tmp);
fclose($fh);
$tmp = "";
}
}
print "<h1>Ура! Мы сделали это!!!</h1>";
?>
Спустя 22 минуты, 20 секунд (17.06.2012 - 14:22) medvedeva написал(а):
FatCat, Спасибо!
Интересно, а скорость обработки от этого же, как я понимаю, пострадает? Ведь так оно всё в оперативке держится, а так будет каждый раз на диск писать.
Интересно, а скорость обработки от этого же, как я понимаю, пострадает? Ведь так оно всё в оперативке держится, а так будет каждый раз на диск писать.
Спустя 1 час, 14 минут, 19 секунд (17.06.2012 - 15:37) FatCat написал(а):
Цитата (medvedeva @ 17.06.2012 - 15:22) |
скорость обработки от этого же, как я понимаю, пострадает? |
Нужно проверять эмпирически.
Дисковые операции безусловно медленнее; но винда иногда начинает свопить, в результате имеем те же дисковые операции, только не записывания несколько байт в каждом шаге, а перезаписывание многомегабайтного своп-файла на каждом шаге.
Я подозреваю, что сутки работы скрипта - это и есть тысячи и тысячи перезаписываний своп-файла.
Спустя 2 часа, 28 минут, 45 секунд (17.06.2012 - 18:05) medvedeva написал(а):
FatCat было уже, повторюсь, своп выставлен руками от 0 до 0, знакома со свопом еще со времён "виртуального пива" (своп 98й винды), оперативки на все мои нужды 4гб с головой хватает. А по-поводу скорости работы, нельзя ли как-то узнать, какая часть скрипта создаёт повышенную нагрузку? Интересно самой очень, разобрала скрипт по полочкам в голове у себя, вроде бы ничего сложного для процессора не наблюдается. Г-н FatCat, если интересно, могу предоставить Вам текстовый файл, который скармливаю скрипту, убедитесь сами, что дело отнюдь не в свопе. Может дело в Denwer'e, ну там PHP собран плохо, или еще чего. Сейчас пошла немного дальше, решила нэтбук (Linux) настроить как полноценный вебсервер (для локальных нужд)
Спустя 2 часа, 11 минут, 56 секунд (17.06.2012 - 20:17) FatCat написал(а):
Цитата (medvedeva @ 17.06.2012 - 19:05) |
могу предоставить Вам текстовый файл |
Да, интересно попробовать.
У меня тоже ДенВер, правда чуть пересобранный. А то как-то некорректно работал с русскими кодировками в 7-й винде.
И все равно латать приходится:
if(stristr($_SERVER['SERVER_SOFTWARE'],"Win"))setlocale(LC_ALL, 'Russian_Russia.1251');
else setlocale(LC_ALL, 'ru_RU.CP1251');
Спустя 9 часов, 19 минут, 10 секунд (18.06.2012 - 05:36) medvedeva написал(а):
На этот раз за 13 часов скрипт справился Всё получилось в лучшем виде, ничего не побилось, всё что можно было исправить, похоже, исправлено, думаю, скрипт может претендовать на:
"Словожуй" v.1.0 RC
UPD:
Странно, скормила еще один текст скрипту 800кб, по идее не меньше часа должен был работать, а он справился за 10 минут. Видимо зависимость времени работы такова = [размер файла]*[коэф. сложности текста].
"Словожуй" v.1.0 RC
UPD:
Странно, скормила еще один текст скрипту 800кб, по идее не меньше часа должен был работать, а он справился за 10 минут. Видимо зависимость времени работы такова = [размер файла]*[коэф. сложности текста].
Спустя 16 часов, 33 минуты, 30 секунд (18.06.2012 - 22:10) FatCat написал(а):
Потестировал на чем тормоза, оказалось на операции substr($txt[,1]) - она выполняется тем медленнее, чем длиннее $txt
Сам переводчик работает быстро: на 8-мегабайтном файле под денвером за 60 секунд успевает перевести 9700 символов, а с отключенным переводом тупо substr() - 10000 символов - то есть, сам перевод съедает всего 3% ресурсов.
Для пробы отрезал кусок файла размером 360 кб - скорость обработки возросла до 42000 символов за минуту.
И это проблема винды. На хостинге 8-метровый файл обрабатывался меньше 10 минут.
Сам переводчик работает быстро: на 8-мегабайтном файле под денвером за 60 секунд успевает перевести 9700 символов, а с отключенным переводом тупо substr() - 10000 символов - то есть, сам перевод съедает всего 3% ресурсов.
Для пробы отрезал кусок файла размером 360 кб - скорость обработки возросла до 42000 символов за минуту.
И это проблема винды. На хостинге 8-метровый файл обрабатывался меньше 10 минут.