字符串中最长的单词

4

如何获取字符串中的最长单词?

例如:

$string = "Where did the big Elephant go?";

返回 "Elephant"


8
到目前为止,你尝试过什么?虽然有人可能会给你答案,但如果你先尝试一些东西,你会学到更多。而且,如果你表现出已经思考过这个问题,你很可能会得到更好的答案。 - JasCav
7个回答

17

遍历字符串中的单词,同时记录到目前为止最长的单词:

<?php
$string = "Where did the big Elephant go?";
$words  = explode(' ', $string);

$longestWordLength = 0;
$longestWord = '';

foreach ($words as $word) {
   if (strlen($word) > $longestWordLength) {
      $longestWordLength = strlen($word);
      $longestWord = $word;
   }
}

echo $longestWord;
// Outputs: "Elephant"
?>

可以更加高效一些,但是你已经明白了大意。


3
你只用了15秒钟就写出来了? - JakeParis
4
@JMCCreative:我非常棒。 - Lightness Races in Orbit
2
@Tomalak 你的厉害之处应该回显 $longestWord 而不是 $word ;) - Sampson
1
@FrankNwoko:此外,您应该知道,“单词长度”在这里包括任何标点符号。您可以使用PHP中的相关字符串函数剥离标点符号。我会让您自行研究这些内容。 - Lightness Races in Orbit
2
@mvds:好吧,我放弃了。这是一个最长标记查找的示例。 - Lightness Races in Orbit
显示剩余9条评论

10

更新:这里有另一种更短的方法(而且这个方法确实是新的;):

function reduce($v, $p) {
    return strlen($v) > strlen($p) ? $v : $p;
}

echo array_reduce(str_word_count($string, 1), 'reduce'); // prints Elephant
与之前发布的相似,但使用 str_word_count 从文本中提取单词(仅通过空格拆分,标点符号也将被计算在内):
$string = "Where did the big Elephant go?";

$words = str_word_count($string, 1);

function cmp($a, $b) {
    return strlen($b) - strlen($a);
}

usort($words, 'cmp');

print_r(array_shift($words)); // prints Elephant

+1 代表使用 str_word_count()。尽管为了简洁起见,我本来会立即将该函数放在对 usort() 的调用中。不过我是 jQuery 约定的奴隶! - Sampson
我不喜欢需要创建一个函数(并污染符号表)的情况!create_function可以解决这个问题,但是会使事情变得非常冗长。 - Lightness Races in Orbit
@Tomalak Geret'kal:我也不喜欢,但有时候是不可避免的(并不是说这种情况就是这样)。 - Felix Kling
@Felix,我不确定你所说的没有对数组的引用是什么意思。我建议使用usort($words, function($a, $b) { /* code */ });应该没有问题。这是@lonesomeday采用的方法。 - Sampson
@Jonathan Sampson:啊,我以为你是要把str_word_count函数放到usort里面:D 我喜欢直接传递函数,但我仍然倾向于以5.2风格回答问题。这样更通用,那些熟悉PHP 5.3的人应该能够转换它... - Felix Kling

2
这样怎么样--按空格分割,按字符串长度排序,然后取第一个:
<?php

$string = "Where did the big Elephant go?";

$words = explode(' ', $string);

usort($words, function($a, $b) {
    return strlen($b) - strlen($a);
});

$longest = $words[0];

echo $longest;

编辑 如果您想排除标点符号,例如:"Where went the big Elephant?",您可以使用preg_split

$words = preg_split('/\b/', $string);

@Tomalak 的确,它要慢一些。不过,这是一个替代方案,也许甚至更漂亮。 - lonesomeday

0

这是一个处理文本非常有用的函数,因此创建一个PHP函数可能是一个不错的主意:

function longestWord($txt) {
    $words = preg_split('#[^a-z0-9áéíóúñç]#i', $txt, -1, PREG_SPLIT_NO_EMPTY);
    usort($words, function($a, $b) { return strlen($b) - strlen($a); });
    return $words[0];
}
echo longestWord("Where did the big Elephant go?");
// prints Elephant

在这里测试该函数:http://ideone.com/FsnkVW


0
$string ='Where did the big Elephant';
function longestWord($str) {
$str.=" ";
$ex ="";
$max ="";
for($i = 0; $i < strlen($str); $i++)
{
    if($str[$i]==" ")
    {
        if(strlen($ex) > strlen($max))
            $max = $ex; 
            $ex ="";
    }else
    {
        $ex.=$str[$i];             
    }
}
return $max;
}
echo longestWord($string);

目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何编写好答案的更多信息。 - Amit

0

这里有另一个解决方案:

$array = explode(" ",$string);
$result = "";
foreach($array as $candidate)
{
if(strlen($candidate) > strlen($result))
$result = $candidate
}
return $result;

0
一个可能的解决方案是在常见分隔符(例如空格)上拆分句子,然后迭代每个单词,并仅保留对最大单词的引用。
请注意,这将找到第一个最大的单词。
<?php
function getLargestWord($str) {
  $strArr = explode(' ', $str); // Split the sentence into an word array
  $lrgWrd = ''; // initial value for comparison
  for ($i = 0; $i < count($strArr); $i++) {
    if (strlen($strArr[$i]) > strlen($lrgWrd)) { // Word is larger
      $lrgWrd = $strArr[$i]; // Update the reference
    }
  }
  return $lrgWrd;
}
// Example:
echo getLargestWord('Where did the big Elephant go?');
?>

虽然提供的代码回答了问题,但你可以假设阅读问题的人不理解它,请提供注释解释你正在做什么,因为这是一个更简单的问题。 - Bonatti

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接