我的函数trim_text
在使用dash_text
等其他函数时不会给出修剪过的单词。但是直接向trim_text
提供一个字符串就行了!
function trim_text($data, $limit){
$words = str_word_count($data, 1);
$trim = (count($words) >= $limit)? array_slice($words, 0, $limit) : $words;
return implode(" ", $trim);
}
function dash_text($data){
$data = str_replace(' ','-',$data);
return $data;
}
$title = 'this is a test.';
$slug = trim_text(dash_text($title), 2);
var_dump($slug); //this will not return the trimmed words but instead return `this-is-a-test.`
//should return `this-is`
$slug = trim_text('this is a test', 2);
var_dump($slug); //but this would!
此外,如果我的方法不是最佳做法(我不是在谈论安全性),请告诉我将$title
转换为降低,修剪和虚线的字符串的建议。
答案 0 :(得分:2)
您应该致电$slug = dash_text(trim_text($title, 2));
而不是trim_text(dash_text($title), 2);
<强>解释强>
在您的情况下,方法dash_text($title)
将首先执行,并返回this-is-a-test.
。方法trim_text
在此字符串上执行。因此,它将返回this-is-a-test.
,因为输入中没有单词分隔符。
另一方面,dash_text(trim_text($title, 2));
将首先执行trim_text
并返回this is
。然后dash_text
将在this is
上执行,并返回this-is
。
答案 1 :(得分:2)
因为这行代码:
$data = str_replace(' ','-',$data);
您正在用破折号替换空间。
以空格连接的单词是不同的。
e.g。在字符串
中 this is a test.
,this
,is
,a
,...
是字
但是,与hypen(破折号)连接并没有什么不同。
e.g。 this-is-a-test
this-is-a-test
是唯一的词。
所以,
更改
trim_text(dash_text($title), 2);
要:
$slug = dash_text(trim_text($title, 2));
答案 2 :(得分:1)
问题在于str_word_count函数不计算由&#34; - &#34;分隔的单词。作为多个单词。请参阅PHP文档:
http://lv.php.net/str_word_count
出于此功能的目的,&#39; word&#39;被定义为包含字母字符的语言环境相关字符串,它也可以包含但不能以&#34;&#39;&#34;&#34;和&#34; - &#34;字符。
由于您将所有空格转换为&#34; - &#34;然后通过文本&#39;这是一个测试&#39;对于trim_text函数,总是从str_word_count获得1的返回值。
请注意所调用的功能顺序。