2011-01-13 33 views
0

我不习惯正则表达式,因此对于我来说这可能看起来很简单。将wordwrap应用于html内容,不包括html属性

基本上,我申请换行内容,包含传统的HTML标签:,...

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

正如你看到的,我的问题很简单:我要的是申请换行( )到我的内容,排除什么可能是HTML属性:href,src ...

有人可以帮我吗?非常感谢 !

+1

你将不得不解析HTML。做一个搜索,这里有大约1000个关于这个的帖子。也许你可以使用strip_tags然后换行,并与原始结合... – profitphp 2011-01-13 17:09:02

回答

1

你不应该使用正则表达式,当然HTML解析,但这应该分开出
应该你想要的内容。我对PHP的知识有限,所以这只是说明程序。

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

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

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

替换字符串是组别1 catted您 自动换行函数的返回值(这是传递的内容,组2串) 所以像:更换= \ 1。 textwrap(\ 2)
您可以在textwrap内部决定如何处理内容。

测试在Perl(BTW它非常缓慢,淡化为清楚起见):

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

从文档中使用any DOM parser capable of extracting the text nodes。遍历文本节点,在它们上应用wordwrap并将它们写回到它们各自的文本节点。

的方法是相同的,一个在

只是不是检查链接的文本内容的给,你对他们的应用您wordwrap

你的问题的更一般的措辞是:“如何(有选择地)获取一个HTML文档的文本内容的功能,适用于它”