如何使用str_replace或其他函数仅更改一次单词内的字符串?

时间:2018-09-26 09:05:06

标签: php string str-replace

我需要更改字符串中的某些单词-我必须将字符串分隔成2个或更多单词-或在单词前后添加空格。例如,我有shopifystore-必须用2个字分开:“ shopify and store,所以结果必须是:” shopify store“。再有一个示例-我有dogsstore-这必须用2个字分开”:dogs and store,因此结果必须是:“狗店”

所以,我写了一些函数,但是效果不是很好。我的功能:

void OnItemSelected(object sender, SelectedItemChangedEventArgs e)
    {
        var item = e.SelectedItem as MasterPageItem;
        if (item != null)
        {
            Detail = new NavigationPage((Page)Activator.CreateInstance(item.TargetType));
            item.IsVisible = false; //this would make the clicked item invisible
            masterPage.listView.SelectedItem = null;
            IsPresented = false;
        }
    }

但是,来自“ dogsstore”的重排是:“ dog s store”和“ shopifystore”将转到:“ shop ify store”。有人可以帮我重写php代码以获得正确的结果吗?

2 个答案:

答案 0 :(得分:2)

您可以使用第二种形式的strtr进行替换。在这种模式下,它将使用一系列替换对,并且从最长的字符串开始向下进行替换,它将不再替换该子字符串。因此,您只需要使用array_combine$latin$latinchanged数组合并为一个数组,然后调用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 

答案 1 :(得分:1)

问题在于字符串与多个搜索项匹配。 您可以假设每个字符串只希望更改一次,因此可以进行循环以避免该问题:

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);
        }
    }
}

这样,更改后的字符串将在第一次替换后返回。