2

与えられた文字列:

<b>Lorem ipsum dolor sit amet, <i>consectetuer adipiscing</i> elit.</b> Donec odio. Quisque volutpat mattis eros.

次の配列を出力する必要があります。

$output = array(
    array(
        'text'=>'Lorem ipsum dolor sit amet, ',
        'formats' => array('bold')
    ),
    array(
        'text'=>'consectetuer adipiscing',
        'formats' => array('bold','italic')
    ),
    array(
        'text'=>' elit.',
        'formats' => array('bold')
    ),
    array(
        'text'=>'  Donec odio. Quisque volutpat mattis eros.'
    )
);

これは可能ですか?もっともらしい?おそらく?

4

1 に答える 1

7

2つのアプローチを使用することで可能です。

最初のオプションは正規表現です。を使用してテキストを解析できますpreg_match()。たとえば、タグ間でテキストを抽出するには、次のようなものを使用できます。

preg_match("@<[^>]>([^<]+)</[^>]>@", $yourHtmltext, $m);
// $m[1] will contain the text between tags
echo $m1;

ただし、ネストされたタグと属性を持つ複雑なHTMLテキストの正規表現を使用して文字列をトークン化するのはかなり面倒です。

私の意見では、DOM解析を使用してHTMLテキストのDOM構造を解析する方がはるかに良いでしょう。このアプローチにより、必要なもの(タグ、タグ間のテキスト、タグ属性など)をノードごとに抽出して、テキストノードをトラバースできます。これは、PHPの組み込みDOMDocumentを使用してHTMLテキストを解析する簡単な例です(phpから取得した例)。ネット):

$myhtml = <<<EOF
<html>
<head>
<title>My Page</title>
</head>
<body>
<p><a href="/mypage1">Hello World!</a></p>
<p><a href="/mypage2">Another Hello World!</a></p>
</body>
</html>
EOF;

$doc = new DOMDocument();
$doc->loadHTML($myhtml);

$tags = $doc->getElementsByTagName('a');

foreach ($tags as $tag) {
       echo $tag->getAttribute('href').' | '.$tag->nodeValue."\n";
}
?>

正規表現の代わりにDOM解析を使用することの追加の利点は、任意の複雑な構造のHTMLテキストを解析できることと、HTMLテキスト構造または要件の将来の変更にスクリプトを簡単に採用できることです。ライブラリの詳細については、DOMDocumentに関するドキュメントを参照してください。

于 2012-11-06T10:44:37.247 に答える