web-dev-qa-db-ja.com

HTMLタグ間のテキストを取得する

わかりました。これはかなり基本的な質問ですが、PHPは初めてで、理解できませんでした。入力文字列は$ dataで、引き続きプルして使用するだけです最初の一致です。以下は正しくありませんか?これは、2つのhtmlタグ(最初に見つかったセット)の間にコンテンツをプルして、残りのデータを破棄しようとするだけで、アクションを実行する最良の方法ではない場合もあります。よく似た質問です。すべて読んでください。これを行うためのより良い方法と、残りのコードの残りの新しい入力として一致を定義する方法がある場合、私の質問は混合です。$ matchesを$ data2に変更した場合そこからそのまま使用すると、エラーが返されます。

preg_match('/<h2>(.*?)<\/h2>/s', $data, $matches);
11
Ryan Cooper

通常、問題には正規表現を使用することをお勧めします。

http://php.net/preg_match を見ると、複数の一致がある可能性があるため、$ matchesは配列になります。試す

print_r($matches);

結果がどのように見えるかを理解し、適切なインデックスを選択します。

編集:

一致がある場合、括弧グループ間で抽出されたテキストを取得できます

print($matches[1]);

括弧グループが複数ある場合は、2、3などの番号が付けられます。一致しない場合も考慮する必要があります。この場合、配列のサイズは0になります。

12
Erik

preg_matchを介してHTMLを解析せず、代わりにこれを使用してくださいPHPクラス:

DOMDocumentクラス

例:

<?php 

$html= "<p>hi</p>
<h1>H1 title</h1>
<h2>H2 title</h2>
<h3>H2 title</h3>";
 // a new dom object 
 $dom = new domDocument('1.0', 'utf-8'); 
 // load the html into the object 
 $dom->loadHTML($html); 
 //discard white space 
 $dom->preserveWhiteSpace = false; 
 $hTwo= $dom->getElementsByTagName('h2'); // here u use your desired tag
 echo $hTwo->item(0)->nodeValue; 
 //will return "H2 title";
 ?>

参考

23
diEcho

あなたはそれをこのようにすることができます::

$h1 = preg_replace('/<h1[^>]*?>([\\s\\S]*?)<\/h1>/',
'\\1', $h1);

これにより、<H1></H1> HTMLタグからTEXTが取り除かれるか、ラップが解除されます

1
ErickBest