2011-11-08 9 views
0

私はこれをグーグルで試してみましたが、何もわかりませんでした。preg_match_allのパターンを作成する方法

<vboxview leftinset="10" rightinset="0" stretchiness="1"> // CONTENT INSIDE HERE </vboxview> 

そして第二に、あなたはまた、セクションごとに詳細にパターンを説明してください、何それがないと、あなたが指定する方法ことができます:最初の私は、誰かが私には、これらのタグの間で情報を取得するためのパターンを書き込む助けることができる期待していましたコードの特定の部分を取得します。

+2

XMLパーサを使用します。 Regexexは、XMLやHTMLを解析するためのものではありません。 – Cfreak

+0

okですが、preg_match_allは何のために使用されますか? php.net上では実際にhtmlを解析する例を示しているからです。 –

+2

@AhouraGhotbi - はい、それは悪い例です、彼らはそれを変更する必要があります。正規表現は、パターンを持つデータを解析するためのものです。定義によるXMLとHTMLは構造化されていません。あなたはそれらを解析するために正規表現を使うことができますが、ファイルが特定の方法で構造化される必要はないので、良い考えではありません。言い換えれば、誰かがあなたの仕様に合ったXMLファイルを与えたとしても、あなたのプログラムが壊れる危険性が高いからです。 – Cfreak

答えて

1

は、SGMLベースの言語と正規表現の私の暴言についての質問に私のコメント...私の答えに今

を参照してください。あなたが問題になっているタグ内の他のHTML/XMLの要素が存在しなくなることがわかっている場合

、これは非常によく動作します:内訳

<vboxview\s(?P<vboxviewAttributes>(\\>|[^>])*)>(?P<vboxviewContent>(\\<|[^<])*)</vboxview> 

、この表現は言う:

<vboxview     # match `<vboxview` literally 
\s+      # match at least one whitespace character 
(?P<vboxviewAttributes> # begin capture (into a group named "vboxViewAttributes") 
    (\\>|[^>])*    # any number of (either `\>` or NOT `>`) 
)       # end capture 
>       # match a `>` character 
(?P<vboxviewContent>  # begin capture (into a group named "vboxViewContent") 
    (\\<|[^<])*    # any number of (either `\<` or NOT `<`) 
)       # end capture 
</vboxview>    # match `</vboxview>` literally 

あなたはエスケープし、ソース内の>文字を\>として、またはHTML/XMLエンティティとしてさらに改善する必要があります。

bあなたがstart running into problems with regexに行くか、すでに正規表現に関係しない別の方法を使うことになっているでしょう - いずれかの方法で十分です!

+0

ありがとうalot :)私は他の方法を探していますが、今のところこれは良いようです –

1

コメントの中で言及されているように、正規表現でHTMLから物を抽出しようとするのは、通常はお勧めできません。さらに防弾対策に切り替えたい場合は、DOMDocument APIを使用して簡単に情報を抽出する方法の簡単な例をここに示します。

一つだけ vboxviewあなたの入力でもあるように保証されている場合はいっそのこと、あなたが vboxviewid属性を追加し、ダウン短く、より一般にコードを切ることができる(また、あなたがHTMLのコントロールを持っていると仮定)
<?php 
function get_vboxview($html) { 

    $output = array(); 

    // Create a new DOM object 
    $doc = new DOMDocument; 

    // load a string in as html 
    $doc->loadHTML($html); 

    // create a new Xpath object to query the document with 
    $xpath = new DOMXPath($doc); 

    // an xpath query that looks for a vboxview node anywhere in the DOM 
    // with an attribute named leftinset set to 10, an attribute named rightinset 
    // set to 0 and an attribute named stretchiness set to 1 
    $query = '//vboxview[@leftinset=10 and @rightinset=0 and @stretchiness=1]'; 

    // query the document 
    $matches = $xpath->query($query); 

    // loop through each matching node 
    // and the textContent to the output 
    foreach ($matches as $m) { 
      $output[] = $m->textContent; 
    } 

    return $output; 
} 
?> 

関数。

<?php 
function get_node_text($html, $id) { 
    // Create a new DOM object 
    $doc = new DOMDocument; 

    // load a string in as html 
    $doc->loadHTML($html); 

    // return the textContent of the node with the id $id 
    return $doc->getElementById($id)->textContent; 
} 
?> 
関連する問題