2011-01-13 9 views
0

Ich bin nicht an reguläre Ausdrücke gewöhnt, so dass dies für mich einfach und knifflig erscheinen mag.Wenden Sie wordwrap auf HTML-Inhalt an, mit Ausnahme von HTML-Attributen

Im Grunde bin ich wordwrap zum Inhalt der Anwendung, die klassische HTML-Tags enthält: ...

$text = wordwrap($text, $cutLength, " ", $wordCut); 
    $text = nl2br(bbcode_parser($text)); 
    return $text; 

Wie Sie sehen können, mein Problem ist recht einfach: alles, was ich will wordwrap anzuwenden ist () zu meinem Inhalt, ausschließlich was könnte in HTML-Attributen sein: href, src ...

Könnte mir jemand helfen? Danke vielmals !

+1

Sie werden die HTML zu analysieren haben. Mach eine Suche, es gibt ungefähr 1000 Posts über genau das. Vielleicht könntest du strip_tags benutzen, dann wickle und kombinierst wieder mit original ... – profitphp

Antwort

1

Sie sollten nicht verwenden regex für HTML-Analyse natürlich , aber das sollte
Inhalt trennen, sollten Sie wollen. Ich habe begrenzte Kenntnisse von PHP, also veranschaulicht das nur Verfahren.

$tags = 
' < 
    (?: 
     /?\w+\s*/? 
    | \w+\s+ (?:".*?"|\'.*?\'|[^>]*?)+\s*/? 
    | !(?:DOCTYPE.*?|--.*?--) 
    )> 
'; 

$scripts = 
' < 
    (?: 
     (?:script|style) \s* 
    | (?:script|style) \s+ (?:".*?"|\'.*?\'|[^>]*?)+\s* 
    )> 
    .*? 
    </(?:script|style)\s*> 
'; 

$regex =/($scripts | $tags) | ((?:(?!$tags).)+) /xsg; 

Der Ersatz-String ist Gruppe1 auf den Rückgabewert Ihrer Zeilenumbruch Funktion catted (die den Inhalt übergeben wird, Group2 string) so etwas wie: Ersatz = \ 1. textwrap (\ 2)
Innerhalb von Textwrap entscheiden Sie, was mit dem Inhalt zu tun ist.

in Perl Getestet (btw seine sehr langsam und für Klarheit verwässert):

use strict; 
use warnings; 

my $tags = 
' < 
    (?: 
     /?\w+\s*/? 
    | \w+\s+ (?:".*?"|\'.*?\'|[^>]*?)+\s*/? 
    | !(?:DOCTYPE.*?|--.*?--) 
    )> 
'; 

my $scripts = 
' < 
    (?: 
     (?:script|style) \s* 
    | (?:script|style) \s+ (?:".*?"|\'.*?\'|[^>]*?)+\s* 
    )> 
    .*? 
    </(?:script|style)\s*> 
'; 

my $html = join '', <DATA>; 

while ($html =~/($scripts | $tags) | ((?:(?!$tags).)+) /xsg) { 
    if (defined $2 && $2 !~ /^\s+$/) { 
     print $2,"\n"; 
    } 
} 
3

Verwenden Sie any DOM parser capable of extracting the text nodes aus dem Dokument. Iterieren Sie über die Textknoten, wenden Sie wordwrap darauf an und schreiben Sie sie zurück in ihre jeweiligen Textknoten.

Der Ansatz, dass man in

nur statt für Links Überprüfung der Textinhalt gegeben identisch ist, gelten Sie Ihre wordwrap auf sie.

Die allgemeinere Formulierung des Problems wäre: „Wie (selektiv) holen den Textinhalt eines HTML-Dokuments mit einer Funktion, um es anzuwenden“