Не полная замена в скрипте для поиска и замены синонимов

Прежде чем начать, я хочу поблагодарить всех, кто помогает мне решить мою проблему — я трачу всю прошлую неделю на поиск ошибки и не могу ее устранить.

Я написал скрипт для поиска слов и фраз во входной строке и заменил их синонимами из базы данных, хранящейся в массиве.

Например:

Есть некоторая строка с фразами для замены. Замена должна быть сделана для каждого вхождения фразы, но по какой-то причине, когда строка содержит более одного вхождения фразы или слова, и я хочу заменить его с помощью функции for loop и substr_replace, заменяется только одно последнее вхождение.

Рядом с каждой важной частью есть мой код с комментариями (для лучшего понимания я написал комментарий со своей проблемой):

<?php

session_start();

function first_run($string)
{
if(isset($_SESSION['iterrated_string']) && !empty(isset($_SESSION['iterrated_string'])))
{
return $_SESSION['iterrated_string'];
}
else
{
return $string;
}
}


//ARRAY WITH THESAURUS DATABASE. KEY IS ORIGINAL WORD AND VALUES ARE REPLACEMENTS
$thesaurus_database = array(
'phrase' => array('word', 'sentence'),
'replace' => array('change', 'overwrite'),
'occurrence' => array('instance', 'existance'),
'made' => array('make', 'do')
);


//THE ORIGINAL INPUT STRING
$string =
'There is some string with phrases to replace. Replace should be made to every occurrence of phrase but for some reason when string have more than one occurrence of phrase or word and i want to replace it using for loop, only one last occurrence is replaced';



foreach(array_keys($thesaurus_database) as $single_record) //READING EVERY SINGLE RECORD FROM THESAURUS DATABASE AND TRYING TO FIND MATCH IN INPUT STRING
{
$string_one = first_run($string); //FUNCTION FOR GIVE ORIGINAL STRING IN FIRST ITTERATION AND FOR SAVE IN SESSION MODIFIED STRING AND RETURN IT WHEN SESSION VARIABLE IS SET FOR NEXT ITERRATIONS

if(preg_match_all("/\b$single_record\b/iu", $string_one, $matches, PREG_OFFSET_CAPTURE))//PREG MATCH ALL WITH RETURNED ARRAY OF FOUND MATCHES AND OFFSETS
{
if(count($matches[0]) > 1) //WHEN MORE THAN ONE OCCURENCE IS FOUND
{
for($i = 0; $i <= count($matches[0])-1; $i++)//FOR LOOP FOR READ MATCHES ARRAY WITH OFFSETS AND MAKE REPLACE USING SUBSTR_REPLACE FUNCTION
{
$replace_multi_occureence = $thesaurus_database[$single_record][rand(0,count($thesaurus_database[$single_record])-1)].'.multi_replace_marker';//VARIABLE WITH REPLACEMENT

$string_two = substr_replace    (
$string_one,
$replace_multi_occureence,
$matches[0][$i][1],
strlen($matches[0][$i][0])
);
$_SESSION['iterrated_string'] = $string_two; //OVERWRITING SESSION VARIABLE WITH MODIFIED STRING FOR NEXT ITERRATION.
}

}
else //WHEN ONLY ONE OCCURENCE IS FOUND
{
$replace_single_occurrence = $thesaurus_database[$single_record][rand(0,count($thesaurus_database[$single_record])-1)].'.single_replace_marker';//VARIABLE WITH REPLACEMENT
$string_two = substr_replace    (
$string_one,
$replace_single_occurrence,
$matches[0][0][1],
strlen($matches[0][0][0])
);
$_SESSION['iterrated_string'] = $string_two; //OVERWRITING SESSION VARIABLE WITH MODIFIED STRING FOR NEXT ITERRATION.
}

}
}

echo $string_two; //MODIFIED STRING

session_destroy();


?>

Обратите внимание на.multi_replace_marker» а также «.single_replace_markerдля лучшего понимания, где замены были сделаны!

Чего я ожидаю:
«Есть какая-то строка с фразами для change.multi_replace_marker. overwrite.multi_replace_marker должно быть make.single_replace_marker каждому instance.multi_replace_marker фразы, но по какой-то причине, когда строка имеет более одного existence.multi_replace_marker из sentence.single_replace_marker или слово, и я хочу change..multi_replace_marker в цикле используется только одно последнее вхождение «

Что дает мне сценарий:
«Есть некоторая строка с фразами для замены. Заменить следует do.single_replace_marker для каждого вхождения фразы, но по какой-то причине, когда строка имеет более одного вхождения sentence.single_replace_marker или слово, и я хочу change.multi_replace_marker он использует для цикла, только один последний existance.multi_replace_marker заменяется

ЭТА ПРОБЛЕМА:
Слова и фразы с одним вхождением заменяются так, как я хочу, но когда есть более одного вхождения, и я пытаюсь заменить его в цикле for, тогда замена выполняется только для элемента в последнем варианте. Почему я использую substr_replace, а не preg_replace?

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

В substr_replace я могу использовать смещение для указания, где замена должна начинаться в каждой итерации. В preg_replace я не могу этого сделать.

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]