从数组中提取固定数量的字符,只需要完整的单词

时间:2011-04-01 23:22:23

标签: php

嘿那里, 我在变量中有一个自定义文本:

$myvar = 'this is my custom text, it is a very long text so be patiente, take care!";

我需要显示让我们说来自$ myvar的前100个字符,但我需要完整的单词。 例如: 这是我的自定义文本,它是一个版本...(我不想在提取时剪切单词)

我该怎么做?

谢谢!

6 个答案:

答案 0 :(得分:4)

有许多方法,但试试这个:

$shortVersion = substr($myvar, 0, 100);
if(strlen($myvar)>100 && preg_match('`\w`', $myvar{100}))
    $shortVersion = preg_replace('`\w+$`', '', $shortVersion);

这可能是你阻力最小的道路。

答案 1 :(得分:1)

user comments on substr() function

中有很多例子

其中一个更简单的是:

function wrapTrunc($str, $len) {
  return substr(($str=wordwrap($myvar,$len,'$$')),0,strpos($str,'$$'));
}

这种基于wordwrap的方法的一个主要缺点是你浪费时间和内存包装整个字符串,即使你只需要保留第一个$len字符。

这是一个基于正则表达式的解决方案,我刚刚发誓说我对此感觉更舒服:

<?php
$myvar = 'this is my custom text, it is a very long text so be patiente, take care!';
var_dump(trunc($myvar, 50));
function trunc($str, $len = 50) {
  return preg_replace("/^(.{1,$len}\S)\b.*/", '$1', $str);
}

示例输出:

$ php test.php
string(49) "this is my custom text, it is a very long text so"

答案 2 :(得分:0)

嗯......因为我们正在编写代码,我的2美分:

<?php
function noWordCut($str, $len, $before=true, $add=' ...', $punctuation=array(' ',',','.','!','?',';')){
    if(!isset($str[$len]))return $str;
    if(in_array($str[$len], $punctuation))return substr($str, 0, $len).$add;
    $dir=($before)?-1:1;
    for(;$len+=$dir;)
        if(in_array($str[$len], $punctuation))
            return substr($str, 0, $len).$add;
    return $str;// one big chunk of word?
}
?>

答案 3 :(得分:0)

猜猜是什么。有一个built-in PHP函数:)

print wordwrap($text, 100);

哎呀,切割你可以使用的第一行:

$first = strtok(wordwrap($text, 100), "\n");

答案 4 :(得分:0)

假设我们拥有字符串变量 $ string $ start $ limit ,我们可以从PHP借用3或4个函数来实现这一目标。他们是:

  • script_tags() PHP函数可删除不必要的HTML和PHP 标签(如果有)。如果没有HTML或PHP标记,则不需要这样做。
  • explode() $ string 拆分为一个数组
  • array_splice()以指定单词数及其起始位置 从。它将由分配给我们的 $ start $ limit 变量的值控制。
  • 最后是 implode(),将数组元素加入到您的截断中 字符串。

    function truncateString($string, $start, $limit){
        $stripped_string =strip_tags($string); // if there are HTML or PHP tags
        $string_array =explode(' ',$stripped_string);
        $truncated_array = array_splice($string_array,$start,$limit);
        $truncated_string=implode(' ',$truncated_array);
    
        return $truncated_string;
    }
    

就这么简单。

我希望这会有所帮助。

答案 5 :(得分:-1)

这是一个可能浪费大量处理时间和内存的坏例子:

<?php
    $text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin congue, quam nec tincidunt congue, massa ipsum sodales tellus, in rhoncus sem quam quis ante. Nam condimentum pellentesque libero at blandit.";
    $length = 100;
    $words = explode(' ', $text);
    for ($x=0; $x <= count($words); $x++) {
        $output = implode(' ', array_slice($words, 0, $x));
        if (strlen($output) >= $length) {
            echo $output . '...';
            break;
        }
    }
?>

为什么?因为我可以。