Как добавить «...» после определенного ограничения слова / символа в PHP? - PullRequest
2 голосов
/ 08 мая 2019

Я работаю над кодом php, как показано ниже:

   <div class="case-breaking__content">
        <p><?php echo the_title(); ?></p>
   </div>

Приведенный выше код php возвращает следующее содержимое:

absv shss xcnx shss hshhs shhsw shshs hsnna hssnnss hssns snnss nnshs sjjjjsjsj nsnnnsns jjsnss snsnns nsnns 

Что я хочу, так это то, что после определенного ограничения слов должно отображаться ... Допустим, после 8 слов должно быть так;

absv shss xcnx shss hshhs shhsw shshs hsnna...

Я пытался следующим образом, но, похоже, он не работает:

<div class="case-breaking__content">
<p><?php $out = strlen(the_title()) > 50 ? substr(the_title(),0,50)."..." : the_title(); ?></p>
</div>

Ответы [ 3 ]

3 голосов
/ 08 мая 2019

Вы можете просто сделать preg_split для пробелов, а затем присоединить массив обратно к строке, с предельным числом, если хотите:

$str = "absv shss xcnx shss hshhs shhsw shshs hsnna hssnnss hssns snnss nnshs sjjjjsjsj nsnnnsns jjsnss snsnns nsnns
";

$arr = preg_split('/(\s)/m', $str);
$limit = 8;
$title = '';
foreach ($arr as $key => $value) {
    if ($key < $limit) {
        $title .= $value . " ";
    } else {
        $title .= "...";
        break;
    }
}

var_dump($title);

Выход

string(47) "absv shss xcnx shss hshhs shhsw shshs hsnna ..."

Вы также можете добавить оператор if, если количество слов было меньше, чем желаемый предел, чтобы просто разорвать цикл, возможно, что-то похожее на:

$str = "absv shss xcnx shss hshhs";
// $str = "absv shss xcnx shss hshhs shhsw shshs hsnna hssnnss hssns snnss nnshs sjjjjsjsj nsnnnsns jjsnss snsnns nsnns";

$arr = preg_split('/(\s)/m', $str);
$limit = 8;
$title = '';
foreach ($arr as $key => $value) {
    if (sizeof($arr) < $limit - 1) {
        $title .= $str . " ...";
        break;
    }
    if ($key < $limit) {
        $title .= $value . " ";
    } else {
        $title .= "...";
        break;
    }
}

var_dump($title);

Вывод

string(29) "absv shss xcnx shss hshhs ..."

Реализация

Если вы хотите реализовать этот код, это может работать:

$arr = preg_split('/(\s)/m', get_the_title());
$limit = 8; // number of words limit
$title = '';
foreach ($arr as $key => $value) {
    if (sizeof($arr) < $limit - 1) {
        $title .= get_the_title() . " ...";
        break;
    }
    if ($key < $limit) {
        $title .= $value . " ";
    } else {
        $title .= "...";
        break;
    }
}

$out = '<div class="case-breaking__content">';
$out .= '<p>';
$out .= $title;
$out .= '</p>';
$out .= '</div>';

echo $out;
2 голосов
/ 08 мая 2019

the_title() повторяет заголовок, а не возвращает его.Если вы выполняете операции над ним, то вы хотите использовать get_the_title().

<div class="case-breaking__content">
<p><?php echo strlen(the_title()) > 50 ? substr(get_the_title(),0,50)."..." : get_the_title(); ?></p>
</div>

При этом, если вы используете WordPress, самый простой вариант - использовать встроенную функцию wp_trim_words() https://codex.wordpress.org/Function_Reference/wp_trim_words

Так в вашем случае

<div class="case-breaking__content">
<p><?php echo wp_trim_words( get_the_title(), 8, '...') ?></p>
</div>
1 голос
/ 08 мая 2019
<div class="case-breaking__content">
    <?php $words = explode(" ", the_title()); ?>
    <p><?php echo count($words) <= 8 ? the_title() : implode(" ", array_slice($words, 0, 8)) . "..."; ?></p>
</div>

Решение Vanilla PHP, не должно быть более сложным, чем это.

...