Как изменить строку внутри слова только один раз, используя str_replace или другую функцию? - PullRequest
0 голосов
/ 26 сентября 2018

Мне нужно изменить некоторые слова внутри строк - я должен разделить строку на 2 или более слов - или добавить пробел до и после слова.Например, у меня есть shopifystore - это должно быть разделено на 2 слова ": shopify и store, поэтому результат должен быть:" shopify store ". Еще один пример - у меня есть dogsstore - это должно быть разделено на 2 слова": dogs and store,так что результат должен быть: "магазин собак"

Итак, я пишу какую-то функцию, но результаты не так хороши.Моя функция:

function englishchange($string) {
$latin = array('dogs','dog','stores','store','shops','shop','shopify');
$latinchanged = array(' dogs ',' dog ',' stores ',' store ',' shops ',' shop ',' shopify ');
return str_replace($latin, $latinchanged, $string);
}
$englishchanged = (englishchange('shopifystore'));

Но результат от "dogsstore" такой: "store's store" и "shopifystore", идущие в: "shop ify store".Может кто-нибудь помочь мне переписать php-код, чтобы получить правильный результат?

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Проблема в том, что строка соответствует нескольким элементам поиска.Вы можете предположить, что вам нужно только одно изменение на строку, чтобы вы могли продолжить цикл, чтобы избежать проблемы:

function englishchange($string)
{
    $latin = array('dogs','dog','stores','store','shops','shop','shopify');
    $latinchanged = array(' dogs ',' dog ',' stores ',' store ',' shops ',' shop ',' shopify ');
    foreach ($latin as $key => $item) {
        if (strpos($string, $item) !== false) {
            return str_replace($item, $latinchanged[$key], $string);
        }
    }
}

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

0 голосов
/ 26 сентября 2018

Вы можете использовать strtr во второй форме для выполнения замен.В этом режиме он принимает массив пар замены и, работая от самых длинных строк вниз, сделав замену, он не заменит эту подстроку снова.Поэтому вам просто нужно объединить массивы $latin и $latinchanged в массив, используя array_combine, а затем вызвать strtr:

function englishchange($string) {
$latin = array('dogs','dog','stores','store','shops','shop','shopify');
$latinchanged = array(' dogs ',' dog ',' stores ',' store ',' shops ',' shop ',' shopify ');
return strtr($string, array_combine($latin, $latinchanged));
}
$englishchanged = (englishchange('dogsstore shopifystore'));
echo $englishchanged;

Вывод:

 dogs  store   shopify  store 
...