开发者

Apply wordwrap to html content, excluding html attributes

I'm not used to regular expressions so this might seem easy while tricky for me.

Basically, i'm applying wordwrap to content, that contains classic html tags : , ...

  $text = wordwrap($text, $cutLengt开发者_JS百科h, " ", $wordCut);
  $text = nl2br(bbcode_parser($text));
  return $text;

As you can see, my problem is pretty simple : all I want is to apply wordwrap() to my content, excluding what could be in html attributes : href , src ...

Could someone help me out ? Thanks a lot !


Use any DOM parser capable of extracting the text nodes from the document. Iterate over the text nodes, apply wordwrap on them and write them back to their respective text nodes.

The approach is identical to that one given in

  • How to replace text URLs and exclude URLs in HTML tags?

just instead of checking the text content for links, you apply your wordwrap on them.

The more general phrasing of your problem would be: "How to (selectively) fetch the text content of a HTML document to apply a function to it"


You shouldn't use regex for html parsing of course, but this should separate out
content should you want to. I have limited knowledge of php so this just illustrates procedure.

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

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

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

The replacement string is Group1 catted to the return value of your word wrap function (which is passed the content, Group2 string) so something like: replacement = \1 . textwrap( \2 )
Inside of textwrap you decide what to do with the content.

Tested in Perl (btw its very slow and watered down for clarity):

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";
    }
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜