2011-12-04 15 views
1

私は次のように、私が取得する必要があり、コンテンツプレースホルダ内のXMLを持っている:正規表現htmlタグを抽出する

<asp:Content ID="Content2" ContentPlaceHolderID="header" runat="server"> 
    <div> 
     <categories> 
      <category> 
       <name>item 1</name> 
       <categories> 
        <category> 
         <name>item 1.1.</name> 
        </category> 
        <category> 
         <name>item 1.2.</name> 
        </category> 
       </categories> 
      </category> 
     </categories> 
    </div> 
</asp:Content> 

のように。私はルートカテゴリを介してXMLにLINQを使用して適切なHTMLを構築しますが、私は正規表現ですべてのXMLを抽出することに失敗しています。 XMLを抽出するより良い方法はありますか?

+3

正規表現を使用しないでください。動作しません。実際のXMLパーサーを使用します。 –

+1

私はルート要素を与えるすべてのxmlツリーを抽出する必要があります。しかし、xmlはhtmlによってsuroundedされることを覚えておくことが重要です。 –

答えて

0

次の正規表現は、 xmlと一致します。また、は、ASP内部すべてキャプチャします。1.

(?s)<asp:Content ID="[^"]*"\W+ContentPlaceHolderID="[^"]*"\W+runat="[^"]*">(.*?)</asp:Content> 

注コンテンツタグをグループにそれを置くこと、特定の正規表現でオンにインライン修飾語「ドットが改行にマッチする」であるモード(S?) .NET、Java、Perl、Python、PHPのpreg関数用PCREなどのフレーバー。

異なる正規表現フレーバーを使用している場合は、(?s)を削除し、「ドットが新しい行に一致します」を別の方法でアクティブにする必要があります。

次のコードは、グループキャプチャを取得します。一般的な解決策を示すために、件名の文字列にはこれらのプレースホルダの2つが含まれています。ここで

<?php 
$subject=' 
<asp:Content ID="blah" ContentPlaceHolderID="blah" runat="blah">Capture Me!</asp:Content> 
<asp:Content ID="Content2" ContentPlaceHolderID="header" runat="server"> 
<div> 
<categories> 
<category> 
    <name>item 1</name> 
      <categories> 
       <category> 
        <name>item 1.1.</name> 
       </category> 
       <category> 
        <name>item 1.2.</name> 
       </category> 
      </categories> 
     </category> 
    </categories> 
</div> 
</asp:Content> 
'; 

preg_match_all('%(?s)<asp:Content ID="[^"]*"\W+ContentPlaceHolderID="[^"]*"\W+runat="[^"]*">(.*?)</asp:Content>%', $subject, $result,PREG_OFFSET_CAPTURE | PREG_PATTERN_ORDER); 
for ($i = 0; $i < count($result); $i++) { 
echo "Capture number: ".$i."<br />".htmlentities($result[1][$i][0])."<br /><br />"; 
// echo "Match number: ".$i."<br />".htmlentities($result[0][$i][0])."<br /><br/>"; 
} 
?> 

が出力されます。

Capture number: 0 
Capture Me! 

Capture number: 1 
<div> <categories> <category> <name>item 1</name> <categories> <category> <name>item 1.1.</name> </category> <category> <name>item 1.2.</name> </category> </categories> </category> </categories> </div> 

あなたもマッチ全体(だけでなく、キャプチャ)を表示したい場合は、単にためのループに第2のエコー行のコメントを解除します。

これはあなたが探していたものだと思いますか?