web-dev-qa-db-fra.com

Tronquer des longueurs d'informations variables

On m'a aidé récemment avec une forme de troncature personnalisée par Toscho sur ce post cela fonctionne très bien, mais je constate que je dois créer plusieurs variations de longueur pour différents éléments de contenu. Par exemple, sur ma page d’assistance, il me faut 80 max_chars et ma page d’accueil dont j'ai besoin de 200 max_chars.

J'ai essayé d'ajouter une deuxième instance de cette fonction, mais sans surprise, cela a totalement tué d'autres aspects de mon site.

Comme toujours, toute aide serait la bienvenue. Merci les gars!

function utf8_truncate( $string, $max_chars = 200, $append = "\xC2\xA0…" )
{
    $string = strip_tags( $string );
    $string = html_entity_decode( $string, ENT_QUOTES, 'utf-8' );
    // \xC2\xA0 is the no-break space
    $string = trim( $string, "\n\r\t .-;–,—\xC2\xA0" );
    $length = strlen( utf8_decode( $string ) );

    // Nothing to do.
    if ( $length < $max_chars )
    {
        return $string;
    }

    // mb_substr() is in /wp-includes/compat.php as a fallback if
    // your the current PHP installation doesn't have it.
    $string = mb_substr( $string, 0, $max_chars, 'utf-8' );

    // No white space. One long Word or chinese/korean/japanese text.
    if ( FALSE === strpos( $string, ' ' ) )
    {
        return $string . $append;
    }

    // Avoid breaks within words. Find the last white space.
    if ( extension_loaded( 'mbstring' ) )
    {
        $pos   = mb_strrpos( $string, ' ', 'utf-8' );
        $short = mb_substr( $string, 0, $pos, 'utf-8' );
    }
    else
    {
        // Workaround. May be slow on long strings.
        $words = explode( ' ', $string );
        // Drop the last Word.
        array_pop( $words );
        $short = implode( ' ', $words );
    }

    return $short . $append;
}
1
Zach Shallbetter

Je sais que toscho n'aime pas trop cela, mais de toute façon: Converti les arguments d'entrée en un tableau:

function utf8_truncate( $args = array( 'string' => null, 'max_chars' => 200, 'append' => "\xC2\xA0…" ) )
{
    $args['string'] = strip_tags( $args['string'] );
    $args['string'] = html_entity_decode( $args['string'], ENT_QUOTES, 'utf-8' );
    // \xC2\xA0 is the no-break space
    $args['string'] = trim( $args['string'], "\n\r\t .-;–,—\xC2\xA0" );
    $length = strlen( utf8_decode( $args['string'] ) );

    // Nothing to do.
    if ( $length < $args['max_chars'] )
    {
        return $args['string'];
    }

    // mb_substr() is in /wp-includes/compat.php as a fallback if
    // your the current PHP installation doesn't have it.
    $args['string'] = mb_substr( $args['string'], 0, $args['max_chars'], 'utf-8' );

    // No white space. One long Word or chinese/korean/japanese text.
    if ( FALSE === strpos( $args['string'], ' ' ) )
    {
        return $args['string'] . $args['append'];
    }

    // Avoid breaks within words. Find the last white space.
    if ( extension_loaded( 'mbstring' ) )
    {
        $pos   = mb_strrpos( $args['string'], ' ', 'utf-8' );
        $short = mb_substr( $args['string'], 0, $pos, 'utf-8' );
    }
    else
    {
        // Workaround. May be slow on long strings.
        $words = explode( ' ', $args['string'] );
        // Drop the last Word.
        array_pop( $words );
        $short = implode( ' ', $words );
    }

    return $short . $args['append'];
}

Cela permet de l’utiliser comme ceci (vous avez peut-être oublié comment utiliser les tableaux de toute façon) :

$args = array(
     'string' => 'bla'
    ,'max_chars' => 50 // INPUT LENGTH HERE
);
echo '<p>' . utf8_truncate( $args ) . '</p>';

Vous pouvez également changer ceci à la demande:

if ( is_page() )
{
    $args['max_chars'] = 100;
}
elseif ( is_archive() )
{
    $args['max_chars'] = 50;
}
elseif ( is_whatever() )
    ... etc ...
}
1
kaiser