5

<h1><h2>etc多くのHTMLを含む文字列から、タグからすべてのテキストを新しい変数に抽出するにはどうすればよいですか?

これらの要素からすべてのテキストをキャプチャし、コンマ区切りの値として新しい変数に格納したいと思います。

使用できpreg_match_all()ますか?

4

7 に答える 7

6

まず、HTML(例では$ html_str)をtidyでクリーンアップする必要があります。

$tidy_config = array(
    "indent"               => true,
    "output-xml"           => true,
    "output-xhtml"         => false,
    "drop-empty-paras"     => false,
    "hide-comments"        => true,
    "numeric-entities"     => true,
    "doctype"              => "omit",
    "char-encoding"        => "utf8",
    "repeated-attributes"  => "keep-last"
);

$xml_str = tidy_repair_string($html_str, $tidy_config);

次に、XML($ xml_str)をDOMDocumentにロードできます。

$doc = DOMDocument::loadXML($xml_str);

そして最後に、HoriaDragomirの方法を使用できます。

$list = $doc->getElementsByTagName("h1");
for ($i = 0; $i < $list->length; $i++) {
    print($list->item($i)->nodeValue . "<br/>\n");
}

または、DOMDocumentでのより複雑なクエリにXPathを使用することもできます(http://www.php.net/manual/en/class.domxpath.phpを参照) 。

$xpath = new DOMXPath($doc);
$list = $xpath->evaluate("//h1");
于 2010-01-14T14:53:21.610 に答える
3

ネイティブのDOMDocumentphpクラスも検討してください。

$domdoc->getElementsByTagName('h1')見出しを取得するために使用できます。

于 2010-01-14T14:44:19.413 に答える
3

これは非常に古い投稿であることは知っていますが、見出しタグをまとめて取得することができた最善の方法について言及したいと思います。

<h1>title</h1> and <h2>title 2</h2>

このメソッド(正規表現として機能しますが、PHPの動作は少し異なります。)

/<\s*h[1-2](?:.*)>(.*)</\s*h/i

これをpreg_matchで使用します

|<\s*h[1-2](?:.*)>(.*)</\s*h|Ui

$group[1]見出しタグの間にあるものが含まれます。 $group[0]すべてです<h1>test</h

これはスペースを考慮し、誰かが「class/id」を追加した場合

<h1 class="classname">test</h1>

クラス/ID(グループ)は無視されます。

:HTMLタグを分析するときは、常にすべての空白、改行、タブなどを削除して1つのスペースに置き換えます。これにより、複数行、ドットオール...、および場合によっては正規表現のフォーマットを混乱させる可能性のある非常に大量の空白が最小限に抑えられます。

  • もちろん、私は1〜2個の見出しタグのみを取得しています。すべてを取得するには、それを0〜9に変更します。
  • 他の誰かが私のコードに追加または修正するmodを持っている場合は、返信してください。本当に知りたいです。
  • それどころか、正規表現がHTMLに悪いのとは対照的に、それは非常にオープンな議論です。php関数と正規表現を設計して、ジャンクを完全に取り除き、正規表現固有の式用にhtmlを準備すると、探しているものを完全に取得できるようになります。アマチュアのhtml作業を置き換えるのに十分な正規表現関数を作成できます。

テストページの正規表現テストへのリンクは次のとおりです

于 2012-09-23T18:46:58.327 に答える
2

このジョブには正規表現を使用せず、SimpleHTMLDOMパーサーを使用することをお勧めします

于 2010-01-14T14:34:40.853 に答える
2

HTMLパーサーを使用する方がおそらく良いでしょう。しかし、本当に単純なシナリオの場合、次のようなことができます。

if (preg_match_all('/<h\d>([^<]*)<\/h\d>/iU', $str, $matches)) {
    // $matches contains all instances of h1-h6
}
于 2010-01-14T14:37:42.843 に答える
2

実際に正規表現を使用したい場合は、次のように思います。

preg_match_all('/<h[0-6]>([^</h[0-6]>*)</h/i', $string, $matches);

ヘッダータグがネストされていない限り、機能するはずです。他の人が言っているように、HTMLを制御できない場合、正規表現はこれを行うための優れた方法ではありません。

于 2010-01-14T14:38:24.823 に答える
1

私は自分のソリューションを共有したいだけです:

function get_all_headings( $content ) {
    preg_match_all( '/\<(h[1-6])\>(.*)<\/h[1-6]>/i', $content, $matches );

    $r = array();
    if( !empty( $matches[1] ) && !empty( $matches[2] ) ){
        $tags = $matches[1];
        $titles = $matches[2];
        foreach ($tags as $i => $tag) {
            $r[] = array( 'tag' => $tag, 'title' => $titles[ $i ] );
        }
    }

    return $r;
}

見出しが見つからなかった場合、または次のような場合、この関数は空の配列を返します。

array (
    array (
        'tag' => 'h1',
        'title' => 'This is a title',
    ),
    array (
        'tag' => 'h2',
        'title' => 'This is the second title',
    ),
)
于 2017-06-19T21:13:43.070 に答える