将字符串缩短到允许的长度

  • 本文关键字:字符串 php
  • 更新时间 :
  • 英文 :


我正在编写一个将字符串转换为URL段符的功能。它工作得很好,但在某些情况下,我最终得到的鼻涕虫超过了65个字符的限制,就像下面这个:

emiteria - matie -马丁内斯-罗宾逊-韦尔斯- 1888 - 1961 -韦尔斯-基础-和- matie韦尔斯

所以我需要添加另一个长度检查,如果它超过,根据一些过滤规则将其削减,使其不超过我的限制。我不想过滤所有的单词,每次只取出一个,直到它少于66个字符。如果在尝试从过滤器中删除术语后str仍然太长,则开始删除最后一个单词,直到满足长度标准。

我开始写这个,但它似乎有点低效。我的思路对吗?

$limit = 65;
$filter = array("and","the","of","at","de","en","la","on","s");
$str = 'emiteria-matie-martinez-robinson-viles-1888-1961-the-viles-foundation-and-matie-viles';
if (strlen($str) > $limit) {
removePart($str);
}  
function removePart($str) {
$arr = explode("-",$str);
// remove one part from filter
$str = implode(" ",$arr);
}
<?php
$limit = 65;
$filter = array("and","the","of","at","de","en","la","on","s");
$str = 'emiteria-matie-martinez-robinson-viles-1888-1961-the-viles-foundation-and-matie-viles';
while (strlen($str) > $limit) {
$str = removePart($str);
}
echo $str;
function removePart($str) {
$arr = explode('-',$str);
array_pop($arr); // remove last element
$str = implode('-',$arr);

return $str;
}

首先,当字符串长度超过限制时,需要从过滤器数组中删除第一个单词。removePart函数从过滤器中删除匹配的单个(第一个)单词。要删除more -在while循环中多次调用它。在此之后,从末尾一个接一个地删除单词,直到字符串足够短。

<?php
$limit = 65;
$filter = array("and","the","of","at","de","en","la","on","s");
$str = 'emiteria-matie-martinez-robinson-viles-1888-1961-the-viles-foundation-and-matie-viles';
while (strlen($str) > $limit) {
$strlen = strlen($str);
$str = removePart($str, $filter);
if (strlen($str) === $strlen) {
break;
}
var_dump($str);
}  
while (strlen($str) > $limit) {
$arr = explode("-",$str);
array_pop($arr);
$str = implode("-",$arr);
var_dump($str);
}

function removePart($str, $filter) {
$arr = explode("-",$str);
// remove one part from filter
foreach ($arr as $i => $word) {
if (in_array($word, $filter)) {
unset($arr[$i]);
break;
}
}
$str = implode("-",$arr);
return $str;
}

输出:

string(81) "emiteria-matie-martinez-robinson-viles-1888-1961-viles-foundation-and-matie-viles" // removed the
string(77) "emiteria-matie-martinez-robinson-viles-1888-1961-viles-foundation-matie-viles" // removed and
string(71) "emiteria-matie-martinez-robinson-viles-1888-1961-viles-foundation-matie" // removed last word
string(65) "emiteria-matie-martinez-robinson-viles-1888-1961-viles-foundation" // removed last word

最新更新