<h1><h2>etc
多くのHTMLを含む文字列から、タグからすべてのテキストを新しい変数に抽出するにはどうすればよいですか?
これらの要素からすべてのテキストをキャプチャし、コンマ区切りの値として新しい変数に格納したいと思います。
使用できpreg_match_all()
ますか?
<h1><h2>etc
多くのHTMLを含む文字列から、タグからすべてのテキストを新しい変数に抽出するにはどうすればよいですか?
これらの要素からすべてのテキストをキャプチャし、コンマ区切りの値として新しい変数に格納したいと思います。
使用できpreg_match_all()
ますか?
まず、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");
ネイティブのDOMDocument
phpクラスも検討してください。
$domdoc->getElementsByTagName('h1')
見出しを取得するために使用できます。
これは非常に古い投稿であることは知っていますが、見出しタグをまとめて取得することができた最善の方法について言及したいと思います。
<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つのスペースに置き換えます。これにより、複数行、ドットオール...、および場合によっては正規表現のフォーマットを混乱させる可能性のある非常に大量の空白が最小限に抑えられます。
テストページの正規表現テストへのリンクは次のとおりです
このジョブには正規表現を使用せず、SimpleHTMLDOMパーサーを使用することをお勧めします
HTMLパーサーを使用する方がおそらく良いでしょう。しかし、本当に単純なシナリオの場合、次のようなことができます。
if (preg_match_all('/<h\d>([^<]*)<\/h\d>/iU', $str, $matches)) {
// $matches contains all instances of h1-h6
}
実際に正規表現を使用したい場合は、次のように思います。
preg_match_all('/<h[0-6]>([^</h[0-6]>*)</h/i', $string, $matches);
ヘッダータグがネストされていない限り、機能するはずです。他の人が言っているように、HTMLを制御できない場合、正規表現はこれを行うための優れた方法ではありません。
私は自分のソリューションを共有したいだけです:
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',
),
)