[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: синонимайзер
asandp
Здравствуйте господа программисты.
Пишу наипростейший синонимайзер, но вот появилась одна проблемка и никак не вкурю...
Вот код, проблема описана в нем:

PHP
<?
$stror="Строка, которую нужно синонимизировать";
$file=fopen("base.txt""r");
# база выглядет типа слово|синоним в столбик
while($str=fgets($file)) {
# выдираем по одной строчке
$sear=strpos($str"|");
$stres=substr($str0$sear);
# взяли из строчки базы слово
 
 $newsear=$sear+1;
 
 $strnew=substr($str$newsear);
# взяли синоним к слову
$repl=str_replace($stres$strnew$stror);
/* А вот здесь сама проблема. Как я решил сделать... поиск и замена слов на синонимы из строчки, если не заменилось ничего, то 

повторяем, если заменилось, то при следующем цикле заменяем уже из строчки с прошлой заменой. Таким образом хотел избежать 

той проблемы, что измененная строчка не сохраняется и следующая замена опять проходит в исходной строчке. Вот эту проблему 

нужно решить, помогите ПЛИИИИИИЗ*/
if($repl $stror) {
$repl=str_replace($stres$strnew$stror);
}else{
$repl=str_replace($stres$strnew$repl);
}
}
print 
$repl."<br><br>";



Почему вот так происходит и как этого избежать?



Спустя 33 минуты, 59 секунд (30.08.2009 - 10:58) Гость_hara написал(а):
1. cделайте в следующий раз доброе дело себе и людям:
используйте тег php а не code
[тег code так уныл что читать его хуже чем простой текст(это наверное потому что бледные буквы не способствуют более удобному чтению) - но это так лирика]

2. сделайте доброе дело себе - используйте всегда длинный тег <?php вместо <?


3. ай ай что это такое ? -> if($repl = $stror) {

ну и как вариант:
4. как то не красиво написано, попробуйте использовать explode() там где это нужно,
большой и файл base.txt ? - вы ведь всё равно прогоняете его весь?
- и раз уж так, - то используйте функции file() explode() и str_replace() - с параметрами в виде массивов.
и код станет приятнее и таких проблем у вас не возникнет.



Спустя 15 минут, 49 секунд (30.08.2009 - 11:14) asandp написал(а):
Цитата
используйте тег php а не code

Спасибо, учту!

Цитата
2. сделайте доброе дело себе - используйте всегда длинный тег <?php вместо <?


Вот только не понимаю, ведь разницы нет? или я ошибаюсь?

Цитата
ай ай что это такое ? -> if($repl = $stror) {


это уже начал выдумывать, мозг сломал

Цитата
используйте функции file() explode() и str_replace() - с параметрами в виде массивов


Вот в этом месте поподробнее если не сложно? Как это? что-то я плоховато это знаю... Подскажите плииз

Спустя 7 минут, 14 секунд (30.08.2009 - 11:22) Гость_hara написал(а):
Цитата
Вот только не понимаю, ведь разницы нет? или я ошибаюсь?

ну в общем то так и есть, только кое где могут быть запрещены короткие теги
Цитата
Вот в этом месте поподробнее если не сложно? Как это? что-то я плоховато это знаю... Подскажите плииз
- всё есть на php.net там такая маалеенькая форма поиска по функциям, вам нужно только прочитать их описание, но ->
Цитата
это уже начал выдумывать, мозг сломал

сначала разберитесь с этой ошибкой

Спустя 3 минуты, 43 секунды (30.08.2009 - 11:25) asandp написал(а):
Цитата
сначала разберитесь с этой ошибкой

так вот с ней то изначально мне и нужно разобраться, вот из-за этого я сюда пришел попросить помощи разобраться с ней

Спустя 8 минут, 18 секунд (30.08.2009 - 11:34) asandp написал(а):
Цитата
функции file() explode() и str_replace() - с параметрами в виде массивов


Вот этого вот вообще не понимаю. Объясните как можно этим воспользоваться?
Ну ладно, file() введем строки файла в массив, тогда получится что каждая переменная в массиве будет строкой типа слово|синоним (следуя по моей базе синонимов).
Что далее?
ну допустим с помощью explode() разделим на слова текст который нужно синонимизировать, так?
а потом? str_replace() заменяем в тексте...что на что заменяем? как из предыдущих двух функций найти что на что заменяется и заменить?

Толи тут все совсем не вяжется толи я реально чегото не понимаю....

Спустя 2 минуты, 12 секунд (30.08.2009 - 11:36) Гость_hara написал(а):
да оставте вы в покое пункт 4 моего первого поста.

тут: if($repl = $stror) {
- вас ничего не смущает ???


Спустя 2 минуты, 51 секунда (30.08.2009 - 11:39) asandp написал(а):
Цитата
тут: if($repl = $stror) {
- вас ничего не смущает ???


Про это можно забыть. Это уже был метод "тыка", по которому я судил что если переделанная строка равна исходной, то продолжаем переделывать исходную строку, есле же не равна(т.е. уже чтото заменилось), начинаем переделывать уже переделанную строку...
Но это понятно что не работает, поэтому этот блок можно и убрать, он не нужен.

Спустя 2 минуты, 36 секунд (30.08.2009 - 11:41) Гость_hara написал(а):
надоело, скучно, замените
$repl=str_replace($stres, $strnew, $stror);
на
$stror=str_replace($stres, $strnew, $stror);
и удалите этот ваш блок о котором вам думать лень

Спустя 6 минут, 12 секунд (30.08.2009 - 11:47) asandp написал(а):
Да, вроде получилось, говорюж мозг вскипел и все, начал глючить. Спасибо огромнейшее, этой проблемы больше нет, ща только с базой разберусь и буду доделывать до ума. Еще раз спс!

Спустя 1 час, 1 минута, 55 секунд (30.08.2009 - 12:49) asandp написал(а):
так, проблема за проблемой. сейчас в итоге получается так, что синонимированное слово или словосочетание в тексте в цикле синонимируется похожими синонимами повторно, пока совсем не будет похоже на читабельный текст )))
итак из текста:
Цитата
Функция explode() производит разделение строки в массив. Она возвращает массив строк, каждая из которых соответствует фрагменту исходной строки str, находящемуся между разделителями, указанными аргументом arg.


получается
Цитата
операция explode« » производит раз деление ряды в массив. Она дает массив строк, маловажно какая из которых соотвечает фрагменту финал ной ряды str, о рескрывая щемуся меж раз раз деля й телями, указанными доводом arg.


т.е. синонимируется синоним. как ентого избежать?

Спустя 2 часа, 4 минуты, 8 секунд (30.08.2009 - 14:53) Гость_hara написал(а):

Спустя 1 час, 49 минут, 54 секунды (30.08.2009 - 16:43) Michael написал(а):
Изложил довольно путанно, но смотри (1):
Цитата
$repl=str_replace($stres, $strnew, $stror);

И ты пишешь:
Цитата
той проблемы, что измененная строчка не сохраняется и следующая замена опять проходит в исходной строчке.

Не вижу, хоть убей, присвоения:
PHP
$stror=$repl;

в конце цикла, чтоб дальше измененная строка участвовала в (1)

Спустя 1 час, 47 минут, 53 секунды (30.08.2009 - 18:31) Гость_asandp написал(а):
михаэль, с этим разобрались, нужно поставить переменную для заменения именем переменной с текстом.
а другое...

по поводу стртр..не получается. почитал что делает эта функция, поставил вместо стр_реплац и не получается. не правильно делаю?

Спустя 47 минут, 18 секунд (30.08.2009 - 19:19) hara_ написал(а):
PHP
$data file('base.txt');
foreach(
$data as $v){
    list(
$k_,$v_) = explode('|',$v);
    @
$arr[$k_] = $v_;
}
print 
strtr($txt,$arr);

Спустя 16 часов, 58 минут, 51 секунда (31.08.2009 - 12:17) asandp написал(а):
а этот код это что он делает? в таком состоянии он не пашет вообще чтот

Спустя 17 минут, 31 секунда (31.08.2009 - 12:35) Гость_hara написал(а):
нет слов, тогда я вам просто сочуствую

Спустя 2 часа, 17 минут, 54 секунды (31.08.2009 - 14:53) asandp написал(а):
скажите плиз, не разберусь

Спустя 5 минут, 46 секунд (31.08.2009 - 14:59) asandp написал(а):
что здесь переменные $v $v_ и $k_ ?

Спустя 7 минут, 40 секунд (31.08.2009 - 15:06) asandp написал(а):
сделал вот так:

PHP
<?
$txt="Функция explode() производит разделение строки в массив.";
$data file('base.txt');
foreach(
$data as $v){
    list(
$k_,$v_) = explode('|',$v);
    @
$arr[$k_] = $v_;
print 
strtr($txt,$arr);
}


Ничего не выводится

Спустя 11 минут, 57 секунд (31.08.2009 - 15:18) Romms написал(а):
asandp
Предлагаю:
* сесть за php.net и почитать про все функции которые встречаются
* Подумать что же должна делать твоя программа...
И окончательное но самое главное прикрепить радиатор к мозгам в виде: Встать с под компа и пройтись по городу подумав об задаче....

Спустя 3 минуты, 20 секунд (31.08.2009 - 15:22) Гость_hara написал(а):
вот вы это написали, а хоть понимаете что написали?
как вообще можно что то сочинять не понимая как оно работает, нет честно не понятно мне это.

PHP
$data file('base.txt');
foreach(
$data as $v){
    list(
$k_,$v_) = explode('|',$v);
    @
$arr[$k_] = $v_;
}
print 
strtr($txt,$arr);

что в этом коде вам не ясно? какой момент? почему не посмотреть на php.net что делает
тут каждая функция, какие параметры принимает и что возвращает ?
почему вы засунули print в цикл? - каков по вашему мнению должен быть результат?
нет, я не к тому что "- как вы посмели изменить мой код?" я вполне мог ошибиться.
может быть код вообще не рабочий или возможно как раз так и нужно его изменить, - но как это можно делать не понимая что делаешь???

вобщем идите ка вы на php.net и пока не поймёте что тут значит каждая строка
а вот когда поймёте(пусть даже и не всё) возвращайтесь и спрашивайте что конкретно вам не ясно,
только так вы чему то научитесь.

Спустя 1 минута, 30 секунд (31.08.2009 - 15:23) Гость_hara написал(а):
да в общем то Romms написал тоже самой, ну да ладно, так долго печатал, как то лениво было выбрасывать )

Спустя 20 минут, 30 секунд (31.08.2009 - 15:44) asandp написал(а):
Цитата
Предлагаю:
* сесть за php.net и почитать про все функции которые встречаются
* Подумать что же должна делать твоя программа...
И окончательное но самое главное прикрепить радиатор к мозгам в виде: Встать с под компа и пройтись по городу подумав об задаче....


Не поверишь, все это делал, кроме радиатора конечно

Цитата
вот вы это написали, а хоть понимаете что написали?
как вообще можно что то сочинять не понимая как оно работает, нет честно не понятно мне это.


Дык сочинял как мог, а то что вы написали я просто не понимаю, и сейчас сколько не читал не разбирался не понял

Цитата
что в этом коде вам не ясно? какой момент?


Где здесь вывод из базы понятно. так понял он выводит целые строки (т.е. слово|синоним), чтото увидл про разделение этой строки (explode('|',$v)) НО, откуда эта $v и что она несет?
Что есть $txt в strtr?
Что здесь эта @$arr?

Цитата
почему вы засунули print в цикл?

"тык"


Вот вообщем с пояснениями:


PHP
$data file('base.txt');
/*Вытаскивание всех строк из базы, так?*/
foreach($data as $v){
/*присвоение этим строкам клучей $v(только не понятно что за $v, возможно просто нумерация*/
    
list($k_,$v_) = explode('|',$v);
/*тут понятно что explode разделяет строки $v на фразы между которыми |, а лист читаю, но примеры конкретные.. как моэжно чтото делать с этой функцией когда примеры $k_ и $v_ неизвестные переменные? что это за переменные?*/
    
@$arr[$k_] = $v_;
/* про @$arr вообще ничего не нашел*/
}
print 
strtr($txt,$arr);
/*тут я так понял $txt - сам текст, и $arr - непонятно*/


Вот оно вам что уяснил а что нет. где не правильно?

Спустя 14 минут, 59 секунд (31.08.2009 - 15:59) asandp написал(а):
Вот это:
PHP
<?
$txt="Функция explode() производит разделение строки в массив.";
$data file('base.txt');
foreach(
$data as $v){
    list(
$k_,$v_) = explode('|',$v);
    @
$arr[$k_] = $v_;
}
print 
strtr($txt,$arr);

Выводит вот это:
операция explode« » производит разов дробление строчки в массив.
тоесть как получилось:
кусок слова "разделение" - раз заменилось на "разов" и "деление" на "дробление" и между ними пробел. так то вроде работает, НО!.. нужно чтобы слово не дробилось, а нужный участок определялся через пробел. explode? поможет? хм...

Спустя 4 минуты, 6 секунд (31.08.2009 - 16:03) asandp написал(а):
неа, не помогло, выводится просто Array

Спустя 15 минут, 31 секунда (31.08.2009 - 16:18) Гость_hara написал(а):
нуу
base.txt
HTML
раз|разов
деление|дробление

PHP
$txt 'разделение деление раз выделение разозлили';
$data file('base.txt');
foreach(
$data as $v){
    list(
$k_,$v_) = explode('|',$v);
    @
$from[]=' '.$k_.' ';
    @
$to[]=' '.$v_.' ';
}
print 
str_replace($from,$to,$txt);

Спустя 5 минут, 37 секунд (31.08.2009 - 16:24) asandp написал(а):
smile.gif вооот, вот так все отлично... просто от души! )
Врядли я помоч могу но может..?

Спустя 1 минута, 29 секунд (31.08.2009 - 16:25) Guest написал(а):
нет спасибо))

Спустя 10 минут, 42 секунды (31.08.2009 - 16:36) asandp написал(а):
нет, серьезно, я так не могу..есть немного яда, ))
немного но всеже

хотяя... вы хорошо знаете пхп не демаю что вы в недостатке и моя велоч вам жарче не станет...

Спустя 2 года, 8 месяцев, 24 дня, 3 часа, 13 минут, 24 секунды (25.05.2012 - 19:49) Guest написал(а):
Скрытый текст
ph34r.gif ph34r.gif ph34r.gif ph34r.gif ph34r.gif ph34r.gif ph34r.gif ph34r.gif ph34r.gif ph34r.gif ph34r.gif ph34r.gif ph34r.gif ph34r.gif ph34r.gif ph34r.gif ph34r.gif ph34r.gif ph34r.gif ph34r.gif ph34r.gif ph34r.gif ph34r.gif ph34r.gif ph34r.gif ph34r.gif ph34r.gif ph34r.gif ph34r.gif ph34r.gif blink.gif sad.gif mad.gif mad.gif mad.gif mad.gif mad.gif mad.gif rolleyes.gif rolleyes.gif rolleyes.gif rolleyes.gif dry.gif dry.gif dry.gif sad.gif sad.gif sad.gif sad.gif sad.gif sad.gif smile.gif smile.gif smile.gif smile.gif smile.gif unsure.gif unsure.gif unsure.gif unsure.gif unsure.gif cool.gif cool.gif cool.gif cool.gif tongue.gif tongue.gif tongue.gif biggrin.gif biggrin.gif biggrin.gif laugh.gif laugh.gif laugh.gif laugh.gif wink.gif wink.gif wink.gif ohmy.gif ohmy.gif ohmy.gif huh.gif huh.gif huh.gif huh.gif huh.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.