2008-09-02 24 views
6

こんにちは、私がしたいことは、最初の段落の内容にかかります。HTMLタグの内容を取得する方法は?

<p>Paragraph 1</p><p>Paragraph 2</p><p>Paragraph 3</p> 

私はに実行している問題は、私が最初<p>タグと第1閉塞</p>タグの間のすべてをつかむために正規表現を書いていますということです:文字列$blog_postは、次の形式の段落の多くが含まれています。しかし、それは最初の<p>タグと最後の閉じる</p>タグをつかんでいます。ここで

は私の現在のコードです:

if (preg_match("/[\\s]*<p>[\\s]*(?<firstparagraph>[\\s\\S]+)[\\s]*<\\/p>[\\s\\S]*/",$blog_post,$blog_paragraph)) 
    echo "<p>" . $blog_paragraph["firstparagraph"] . "</p>"; 
else 
    echo $blog_post; 

答えて

18

まあ、sysrqbは、あなたが何かを一致させます段落に他のhtmlがないと仮定して、最初の段落で。あなたはより多くのあなたの*は、それが唯一の</p>に一致する前に、必要な限り小さなテキストと一致しますつまり、それは非欲張り落札後?を置くこの

<p>.*?</p> 

ような何かをしたいかもしれません。

1

おそらく最初

<p> 

と最初

</p> 

の位置を見つけるためにstrpos()を使用する方が簡単かつ迅速になります段落を抽出するには、substr()を使用します。

$paragraph_start = strpos($blog_post, '<p>'); 
$paragraph_end = strpos($blog_post, '</p>', $paragraph_start); 
$paragraph = substr($blog_post, $paragraph_start + strlen('<p>'), $paragraph_end - $paragraph_start - strlen('<p>')); 

編集:実際に他の人の回答では正規表現が簡単かつ迅速になります...問題のあなたの大切な複雑な正規表現が私を混同...

6

preg_matchを使用する場合は、"U"フラグを使用して、貪欲にしないでください。

preg_match("/<p>(.*)<\/p>/U", $blog_post, &$matches); 

$matches[1]その後、最初の段落が含まれています。

0

正規表現を使用してhtml解析を行うことは決して適切なソリューションではありません。この特殊なケースではXPATHを使用する必要があります:

$string = <<<XML 
<a> 
<b> 
    <c>texto</c> 
    <c>cosas</c> 
</b> 
<d> 
    <c>código</c> 
</d> 
</a> 
XML; 

$xml = new SimpleXMLElement($string); 

/* Busca <a><b><c> */ 
$resultado = $xml->xpath('//p[1]'); 
関連する問題