2

正規表現について私よりも多くの知識を持っている人は、HTMLコードを分割して、すべてのタグとすべての単語が区切られるようにする方法を知っていますか.

<p>Some content <a href="www.test.com">A link</a></p>

次のように区切られます。

array = { [0]=>"<p>",
          [1]=>"Some",
          [2]=>"content",
          [3]=>"<a href='www.test.com'>,
          [4]=>"A",
          [5]=>"Link",
          [6]=>"</a>",
          [7]=>"</p>"

これまで preg_split を使用してきましたが、文字列を空白で分割するか、タグで分割することに成功しましたが、これを分割する必要がある場合、すべてのコンテンツが 1 つの配列要素になります。

誰か助けて?

4

5 に答える 5

4

その場合、preg_split は使用しないでください。preg_match_all を試してください:

$text = '<p>Some content <a href="www.test.com">A link</a></p>';
preg_match_all('/<[^>]++>|[^<>\s]++/', $text, $tokens);
print_r($tokens);

出力:

Array
(
    [0] => Array
        (
            [0] => <p>
            [1] => Some
            [2] => content
            [3] => <a href="www.test.com">
            [4] => A
            [5] => link
            [6] => </a>
            [7] => </p>
        )

)

'A'例に inを含めるのを忘れたと思い'A link'ます。

HTML に含まれる < または > がタグの開始または終了として意図されていない場合、正規表現は物事をひどく混乱させることに注意してください! (したがって、警告)

于 2009-11-07T16:43:40.477 に答える
2

Simple HTML DOM Parserをチェックアウトできます

または、PHPのDOM パーサーを見てください。

于 2009-11-07T15:32:03.613 に答える
1

Simple HTML Dom Parserを試してみてください。HTML は正規表現には不規則すぎます。

于 2009-11-07T15:32:03.287 に答える
0

preg_match_all()overの推奨について Bart に同意しませんpreg_split()

タスクは文字通り、文字列全体をさまざまな区切り文字で「分割」することです。最初に、正規表現よりも dom パーサーを使用する安定性をお勧めしますが、入力 html が比較的予測可能/単純であるためにそのレベルの安定性が必要ない場合は、より安価で簡潔な代替手段として正規表現を使用できます。

コード: (デモ)

$html = <<<HTML
<p>Some content <a href="www.test.com">A link</a></p>
HTML;

var_export(preg_split('~\s+|(<[^>]+>)~', $html, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE));

出力:

array (
  0 => '<p>',
  1 => 'Some',
  2 => 'content',
  3 => '<a href="www.test.com">',
  4 => 'A',
  5 => 'link',
  6 => '</a>',
  7 => '</p>',
)

私のパターンは、1 つ以上の空白文字または (弱い解釈の) html タグで分割されます。空白は単に破棄されます。タグは出力に保持されます。

論理セマンティクスを超えpreg_split()て、肥大化が少なく、したがってより直接的な出力を生成するという追加の利点があります。 preg_split()は 1 次元配列をpreg_match_all()提供し、多次元配列を提供します。

最後に、力preg_split()のように「失敗」することはできませpreg_match_all()ん。入力文字列にスペースやタグが含まれていない、ありそうもないフリンジ ケースを想像してみてください。preg_split()入力文字列全体を単一の要素配列として返します (便利で、より一般的な入力文字列と一致します)。preg_match_all()空の配列を生成します (あまり役に立ちません)。

于 2019-06-06T12:20:31.823 に答える
0

私は現在、いくつかのアプリケーションでSimple HTML DOM Parserを使用していますが、他の言語で記述された他の HTML パーサーと比較しても、優れたツールであることがわかります。

HTML を、説明したトークンの文字列に正確に分割するのはなぜですか? DOM 要素のツリーのような構造は、特定のアプリケーションにとってより良いアプローチではありませんか?

于 2009-11-07T15:58:52.407 に答える