PHP обрезать строку - PullRequest
       3

PHP обрезать строку

1 голос
/ 25 января 2012

Я пытаюсь создать функцию для обрезки строки, если она слишком длинна в соответствии с моими спецификациями.

Вот что у меня есть:

function trim_me($s,$max) 
{
    if (strlen($s) > $max) 
    {
        $s = substr($s, 0, $max - 3) . '...';
    }
    return $s;
}

Выше будет обрезать строку, еслион длиннее $max и добавит продолжение ...

Я хочу расширить эту функцию для обработки нескольких слов.В настоящее время он делает то, что делает, но если у меня есть строка, скажите: How are you today? длиной 18 символов.Если я запускаю trim_me($s,10), он будет отображаться как How are yo..., что не эстетично.Как сделать так, чтобы после всего слова добавлялось ....Скажем, если я запускаю trim_me($s,10), я хочу, чтобы он отображал How are you..., добавляя продолжение ПОСЛЕ слова.Есть идеи?

Я почти не хочу добавлять продолжение в середине слова.Но если строка содержит только одно слово, то продолжение может разбить слово только тогда.

Ответы [ 4 ]

0 голосов
/ 25 января 2012

Это на самом деле как-то просто, и я добавляю этот ответ, потому что предлагаемый дубликат не соответствует вашим потребностям (но он дает некоторые указатели).

Вам нужно вырезать строку максимальной длины, но сохранить последнее слово. Таким образом, вам нужно выяснить положение, в котором нужно обрезать строку (и, если это вообще необходимо, обрезать ее).

Поскольку получение длины (strlen) и обрезка строки (substr) - это не ваша проблема (вы уже ее используете), проблема, которую нужно решить это как получить позицию последнего слова в пределах лимита.

Это включает в себя анализ строки и выяснение смещений каждого слова. Обработка строк может выполняться с помощью регулярных выражений. При написании этого, он напоминает мне о действительно более похожем вопросе, где это уже решено:

Это делает именно это: получение строки «полных слов» с помощью регулярного выражения. Единственное отличие состоит в том, что оно удаляет последнее слово (а не расширяет его). Поскольку вы хотите расширить последнее слово, для этого требуется другой шаблон регулярного выражения.

В регулярном выражении \b соответствует границе слова. Это до или после слова. Теперь вы хотите выбрать как минимум $length символов до следующей границы слова.

Поскольку это может содержать пробелы перед следующим словом, вы можете обрезать результат, чтобы удалить эти пробелы в конце.

Вы можете расширить свою функцию следующим образом, используя шаблон регулярного выражения (preg_replace) и trim:

/**
 * Cut a string at length while preserving the last word.
 * 
 * @param string $str
 * @param int $length
 * @param string $suffix (optional)
 */
function trim_word($str, $length, $suffix = '...') 
{
    $len = strlen($str);

    if ($len < $length) return $str;

    $pattern = sprintf('/^(.{%d,}?)\b.*$/', $length);
    $str = preg_replace($pattern, '$1', $str);
    $str = trim($str);
    $str .= $suffix;

    return $str;
}

Использование:

$str = 'How are you today?';
echo trim_word($str, 10); # How are you...

В дальнейшем вы можете расширить это, уменьшив минимальную длину в шаблоне на длину суффикса (как это было предложено в вашем вопросе, однако результаты, которые вы дали в своем вопросе, не совпадали с вашим кодом).

Надеюсь, это полезно. Также, пожалуйста, используйте функцию поиска на этом сайте, она не идеальна, но многие драгоценные камни скрыты в существующих вопросах для альтернативных подходов.

0 голосов
/ 25 января 2012

Итак, вот что вы хотите:

<?php
// Original PHP code by Chirp Internet: www.chirp.com.au 
// Please acknowledge use of this code by including this header.
function myTruncate($string, $limit, $break=".", $pad="...") { 
    // is $break present between $limit and the end of the string? 
    if(false !== ($breakpoint = strpos($string, $break, $limit))) { 
        if($breakpoint < strlen($string) - 1) { 
            $string = substr($string, 0, $breakpoint) . $pad; 
        } 
    } 
    return $string;
}
?>

Кроме того, вы можете узнать больше на http://www.the -art-of-web.com / php / truncate /

0 голосов
/ 25 января 2012

Я назвал функцию str_trunc.Вы можете указать строгое значение ИСТИНА, и в этом случае он будет разрешать только строку максимального размера и не более, в противном случае он будет искать самую короткую строку, подходящую для слова, которое он собирался закончить.

var_dump(str_trunc('How are you today?', 10)); // string(10) "How are..."
var_dump(str_trunc('How are you today? ', 10, FALSE)); // string(14) "How are you..."

// Returns a trunctated version of $str up to $max chars, excluding $trunc.
// $strict = FALSE will allow longer strings to fit the last word.
function str_trunc($str, $max, $strict = TRUE, $trunc = '...') {
    if ( strlen($str) <= $max ) {
        return $str;
    } else {
        if ($strict) {
            return substr( $str, 0, strrposlimit($str, ' ', 0, $max + 1) ) . $trunc;
        } else {
            return substr( $str, 0, strpos($str, ' ', $max) ) . $trunc;
        }
    }
}

// Works like strrpos, but allows a limit
function strrposlimit($haystack, $needle, $offset = 0, $limit = NULL) {
    if ($limit === NULL) {
        return strrpos($haystack, $needle, $offset);
    } else {
        $search = substr($haystack, $offset, $limit);
        return strrpos($search, $needle, 0);
    }
}
0 голосов
/ 25 января 2012
function trim_me($s,$max) {
    if( strlen($s) <= $max) return $s;
    return substr($s,0,strrpos($s," ",$max-3))."...";
}

strrpos - это функция, которая совершает магию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...