Php 从数组中提取固定数量的字符,仅提取完整的单词

Php 从数组中提取固定数量的字符,仅提取完整的单词,php,Php,嘿,那里, 我在变量中有一个自定义文本: $myvar = 'this is my custom text, it is a very long text so be patiente, take care!"; 我需要显示$myvar的前100个字符,但我需要完整的单词。 例如: 这是我的自定义文本,它是一个版本。。。(我不想在摘录时删减文字) 我该怎么做 谢谢大家! 这方面的例子有很多 其中一个比较简单的例子是: function wrapTrunc($str, $len) { ret

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

$myvar = 'this is my custom text, it is a very long text so be patiente, take care!";
我需要显示$myvar的前100个字符,但我需要完整的单词。 例如: 这是我的自定义文本,它是一个版本。。。(我不想在摘录时删减文字)

我该怎么做


谢谢大家!

这方面的例子有很多

其中一个比较简单的例子是:

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);
}

这方面的例子有很多

其中一个比较简单的例子是:

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);
}

有很多种方法,但请尝试以下方法:

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

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

有很多方法,但是试试这个:

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

这可能是阻力最小的路径。

下面是一个可能浪费大量处理时间和内存的糟糕示例:

<?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;
        }
    }
?>


为什么?因为我可以。

以下是一个可能浪费大量处理时间和内存的糟糕示例:

<?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;
        }
    }
?>


为什么?因为我可以。

嗯。。。既然我们要输入代码,我的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?
}
?>

嗯。。。既然我们要输入代码,我的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?
}
?>

猜怎么着。这里有一个PHP函数:)

OOPS,对于切割第一条线,您可以使用:

$first = strtok(wordwrap($text, 100), "\n");
猜猜看。这里有一个PHP函数:)

OOPS,对于切割第一条线,您可以使用:

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

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

  • script_tags()PHP函数删除不必要的HTML和PHP 标签(如果有)。如果没有HTML或PHP标记,就没有必要这样做
  • explode()$string拆分为一个数组
  • array\u splice()指定字数及其起始位置 从…起它将由分配给$start$limit变量的值控制
  • 最后,内爆()将数组元素加入到被截断的数组中 字符串

就这么简单


我希望这是有帮助的。

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

  • script_tags()PHP函数删除不必要的HTML和PHP 标签(如果有)。如果没有HTML或PHP标记,就没有必要这样做
  • explode()$string拆分为一个数组
  • array\u splice()指定字数及其起始位置 从…起它将由分配给$start$limit变量的值控制
  • 最后,内爆()将数组元素加入到被截断的数组中 字符串

就这么简单


我希望这是有帮助的。

我喜欢这个,它比我的建议更简洁,但我认为如果原始字符串开始时少于100个字符,或者原始字符串包含
$$
,它将不起作用。另外,我假设你的
$
应该是100:-)是的,你在这两方面都是对的。还有,我觉得你的正则表达式比我的干净。我确信我的正则表达式在某些边缘情况下是错误的,但它很接近。我唯一想改变的是可能使用
\w
而不是
\s
,这取决于你是否想打断连字符。我喜欢这个,它比我的建议更简洁,但如果原始字符开始时少于100个字符,我认为它不起作用,或者如果原始字符串包含
$$
。另外,我假设你的
$
应该是100:-)是的,你在这两方面都是对的。还有,我觉得你的正则表达式比我的干净。我确信我的正则表达式在某些边缘情况下是错误的,但它很接近。我唯一想改变的是可能使用
\w
而不是
\s
,这取决于你是否想打断连字符。所以,让我直说吧。您不想剪切单词,但只需要完整的单词,并且只需要100个字符。嗯?@Tomalak我猜100是一个限制。100是一个例子,我希望它是灵活的,我可以选择70,90,100-我是限制,太多了。那么你不是说“固定数量的字符”,那么?让我直说吧。您不想剪切单词,但只需要完整的单词,并且只需要100个字符。哈?@Tomalak我猜100是一个限制。100是一个例子,我希望它是灵活的,我可以选择70,90,100-我是限制,太多了。那么你不是说“固定数量的字符”吗?另一个简单的方法是:另一个简单的方法是: