我有这样的字符串。
lasvegashotel
,losangelesrestaurant
,...
喜欢字符串有“拉斯维加斯”,“酒店”,“洛杉矶”,“餐厅”等字样......
我应该从上面的字符串(lasvegashotel
,losangelesrestaurant
)中找到单词。
最终目的是
{
'lasvegashotel'=>'LasVegasHotel',
'losangelesrestaurant'=>'LosAngelesRestaurant',
....
}
我不知道会输入什么词。
请帮我解决这个有趣的问题。
关键字是这些字符串不长。
答案 0 :(得分:0)
所以你的意思是你有像#34; Las Vegas"并且你想用另外两个字符串转换它们,比如" lasvegas"和" LasVegas"。
要做到这一点,首先,我们需要使用函数str_replace删除字符串中的所有空格
然后,这会给我们一个这样的代码:
$basestr = "Las Vegas"; // This will be our base string
$value = str_replace(" ", "", $basestr); // This removes all spaces from $basestr ans saves it as $value
然后,正如您所说,您需要一个没有空格的较低套管版本的字符串。
这一次,我们将使用另一个功能:strtolower。
此函数基本上小写字符串的每个字符并返回它。所以最终的代码看起来像这样:
$basestr = "Las Vegas"; // This will be our base string
$value = str_replace(" ", "", $basestr); // This removes all spaces from $basestr ans saves it as $value
$key = strtolower($value); // Gets a lowercased version of $value
但是如果你想为每个字符串多次,那么创建一个像:
这样的函数 function getKeyAndValue($basestr) {
$value = str_replace(" ", "", $basestr); // This removes all spaces from $basestr ans saves it as $value
$key = strtolower($value); // Gets a lowercased version of $value
return [$key => $value];
}
并为您想要获取的所有字符串调用此函数。
度过愉快的一天。
编辑:由于我对OP问题的误解,这应该是OP要求的答案:
所以我们仍然使用str_replace函数和strtolower函数,但方式不同。
答案很简单,我们用大写字母替换任何小写字。
在这里,我假设每个字符串只有一个单词(也就是没有单独的单词空格),如果不是这样的话,请查看我原来的答案中的处理方法。
foreach($wordList as $wordToCapitalize) {
$basestr = str_replace(strtolower($wordToCapitalize), $wordToCapitalize);
}
答案 1 :(得分:0)
对于该要求,没有可靠的,适合所有人的标记化解决方案。有一个非常好的讨论是斯坦福NLP非常聪明的人解决它的方法:
https://www.youtube.com/watch?v=jBk24DI8kg0&index=4&list=PL6397E4B26D00A269
基本上你需要一个你可以尝试匹配的单词字典,然后弹出字符串的前面。例如,在“lasvegashotel”中,你会有一本带有“las”,“vegas”,“hotel”的字典,或者如果你愿意的话,甚至可以将theram“lasvegas”结合起来。然后,您必须迭代搜索字符串,从源字符串的开头开始查找具有较长子串的匹配项。识别出一个令牌后,将其从源字符串中弹出,然后开始寻找下一个匹配。
这个解决方案的问题在于,“las”不仅会从“lasvegas”中获得标记,还会从“lastmanstanding”中获得标记。有解决方法,但没有银弹解决方案。