PHP, HTML bir alıntıyı alma

4 Cevap php

Benim ön sayfada göstermek için HTML yazılmış haber kısa bir alıntı almak gerekiyor. Bu kapatılmamış etiketleri bırakın hatta yarım etiketi bırakabilir çünkü Açıkçası ben substr gibi basit bir şey kullanamazsınız.

Hangi daha kolaydır:

  • Iyi görünümlü düz metne HTML dönüştürme ve bir parça almak
  • HTML başlangıcını alarak ve kesim herhangi kapanmamış etiketleri kapatarak (bu her zaman tamam bakacağız?)

Ve nasıl seçilen çözümü uygulama hakkında gitmek istiyorsunuz?

4 Cevap

En basit yolu kesiliyor önce strip_tags() kullanarak madde metinden tüm HTML şerit etmektir.

Bu özgün haber öğenin HTML yapısını korumak için önemli ise ben 2 seçeneği alacaktı.

Bunu uygulamak için basit bir yolu kapanmamış etiketleri kapatmak için Tidy aracılığıyla fragmanı çalıştırmak olacaktır. Özel olarak, tidy::cleanRepair yöntem.

Sen XML veri ayrıştırma ve sonra sadece "saf" metin düğümlerini kesiliyor deneyebilirsiniz.

Not: Bu çözüm geçerli XML ve aynı yapı konusunda her zaman olduğu girişini zorlar.

Bu kelime kesmeden birinci fıkrasına aşağı alıntılar ve isteğe bağlı iz ekler.

$ Alıntıdır = self :: excerpt_paragraph ($ html, 180)

/**
* excerpt first paragraph from html content
* 
**/
public static function excerpt_paragraph($html, $max_char = 100, $trail='...' )
{
    // temp var to capture the p tag(s)
    $matches= array();
    if ( preg_match( '/<p>[^>]+<\/p>/', $html, $matches) )
    {
        // found <p></p>
        $p = strip_tags($matches[0]);
    } else {
        $p = strip_tags($html);
    }
    //shorten without cutting words
    $p = self::short_str($p, $max_char );

    // remove trailing comma, full stop, colon, semicolon, 'a', 'A', space
    $p = rtrim($p, ',.;: aA' );

    // return nothing if just spaces or too short
    if (ctype_space($p) || $p=='' || strlen($p)<10) { return ''; }

    return '<p>'.$p.$trail.'</p>';
}
//

/**
* shorten string but not cut words
* 
**/
public static function short_str( $str, $len, $cut = false )
{
    if ( strlen( $str ) <= $len ) { return $str; }
    $string = ( $cut ? substr( $str, 0, $len ) : substr( $str, 0, strrpos( substr( $str, 0, $len ), ' ' ) ) );
    return $string;
}
//