2011-01-13 7 views
0

正規表現には慣れていません。あなたが見ることができるように、私の問題は非常に簡単です、...htmlコンテンツを除くhtmlコンテンツにワードラップを適用してください。

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

::私が望むすべてはワードラップを適用することです(基本的に

、私は古典的なHTMLタグが含まれているコンテンツへのワードラップを適用していますhref、src ...

誰かが私を助けてくれますか?どうもありがとう !

+1

あなたがHTMLを解析する必要があるとしています。検索をすると、ちょうど約1000の記事がここにあります。たぶんstrip_tagsを使って折り返して元のものに戻すことができます... – profitphp

答えて

1

しかし、これはあなたがしたいと思うべきである
の内容を分けなければなりません。私は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は(コンテンツ、グループ2の文字列が渡される)あなたの ワードラップ関数の戻り値にcattedある そうのようなもの:交換= \ 1。テキストラップ(\ 2)
テキストラップの内部では、コンテンツの処理方法を決定します。

は(ところで、その非常に遅く、明確にするために骨抜き)Perlでテスト済み:

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の解析のための正規表現を使用してはならない「どのように(選択的に)それに関数を適用するために、HTML文書のテキストコンテンツをフェッチ」

関連する問題