2016-04-19 26 views
0

EDIT:以下の答えとコメントは、私がこれを明確に説明していないと思うようにしています...リストの複数の出現と一致する正規表現を探しています。たとえば、私はABCBCBCBCBCDを取りたいかもしれませんし、配列[BC、BC、BC、BC、BC]を取得したいと考えています。私はリストにどれくらいのアイテムが入るのか分かりません。それがABCDなら、私はリスト[bc]が必要です。それがABCBCDならば、私は[bc、bc]が必要です。私はBCのすべての出現と一致するように/ A(BC)+ D /を使用することができますが、それは動作しません。 リスト内の項目のPreg_match

元の質問

...

は、私は非常に大きなデータファイルのセットを持っています。ファイルごとに、私はそれの中から項目のリストがほしいだけです。私が探している情報の形式は次のとおりです。

...<RXCUI> <LN ID=531123>Amoxicillin</LN>, <LN ID=441656>Amikacin</LN></ERS>... 

...は、このセットの前後に大量のテキストがあることを意味します。私は簡単に続いて正規表現

preg_match('~<RXCUI>[^<]*(<LN[^>]*>[^<]*</LN>[^<]*)~', $data, $matches); 

を使用してリストの最初の項目を取得することができ、$マッチ[1]は、「アモキシシリン」。リスト内のすべての試合を以下のように使ってみました:

preg_match('~<RXCUI>[^<]*(<LN[^>]*>[^<]*</LN>[^<]*)+~', $data, $matches); 

これは動作しません。私はマッチを得ない。 「(と)の間の前のシーケンスに対する複数の一致」の構文は何ですか?注目すべきは

が、これは、$試合では何かということです:

Array (
    [0] => <RXCUI> <LN ID=531123>Amoxicillin</LN>, <LN ID=441656>Amikacin</LN> 
    [1] => <LN ID=531123>Amoxicillin</LN> 
) 

だから、それは、リスト内の両方のアイテムに見えたが、最初のものだけが返されました。私が欲しいものは:

Array (
    [0] => <RXCUI> <LN ID=531123>Amoxicillin</LN>, <LN ID=441656>Amikacin</LN> 
    [1] => <LN ID=531123>Amoxicillin</LN> 
    [2] => <LN ID=441655>Akikacin</LN> 
) 
+0

これはhttps://regex101.com/r/dZ0vZ3/1ではありませんか? – rock321987

+0

@ rock321987それは動作しません。これはすべてのLNエントリに一致します。私は、RXCUIタグに続くLNエントリだけを必要とします。 – kainaw

+0

'RXCUI'内の' LN'タグのすべての内容、または最初の? – rock321987

答えて

0

これはあなたが探しているものですか?多くの研究の後

preg_match_all("/(\<RXCUI\>.*\<\/LN\>)/", $input_lines, $output_array); 

http://www.phpliveregex.com/p/fpc

+0

これはリスト全体を1つの配列アイテムとして吐き出します。正しい?私がしようとしているのは、リスト内の各項目を独立した配列項目として取得することです。 – kainaw

+0

真..しかし、あなたは "、"で結果を爆発させることはできません。あなたはあなたの2つの部分(またはそれ以上)を持っていますか? '\ (\ 。* <\/LN\>)' preg_match_allを使用すると、配列内のLN部分のみを取得します – Andreas

+0

これは値にコンマがないことを前提としています。ですから、私は爆発したいカンマだけを特定する方法を開発しなければなりません。それは私がマッチの可変数を返す正規表現を得ることができないので、私がしなければならないことです。 – kainaw

0

、単一するpreg_match関数で行うことができないことが表示されます。 2回のパスが必要です。最初のものはリスト全体の最初から最後までを引きます。 2つ目は、リストを目的のマッチに分割します。

最初のパス($をとるS = .../LN > <RXCUI> < LN ID = 531123 >アモキシシリン<、< LN ID = 441656 >アミカシン</LN> </ERS ​​> ...)

preg_match('~<RXCUI>[^<]*(<LN[^>]*>[^<]*</LN>[^<]*)+</ERS>~', $s, $match1); 

、$ MATCH1 [0] = <RXCUI> < LN ID = 531123 >アモキシシリン</LN >、< LN ID = 441656 >アミカシン、私が使用することができます</LN> </ERS ​​> [0]配列を含んでいます、RXCUIとERS要素今

preg_match_all('~<LN[^>]*>[^<]*</LN>~', $match1[0], $match2); 

の間、私がしたいだけで何$ MATCH2を得るためにpreg_match_all:

[0] => <LN ID=531123>Amoxicillin</LN> 
[1] => <LN ID=441656>Amikacin</LN> 

LN行がいくつあるかは関係ありません。2番目のpreg_match_allはそれらをすべて返します。

元の文書のどこにもLN要素がないことを確認できれば、これは大幅に単純化できます。私は彼らがRXCUIセクションの一部ではないLN要素であることを知っています。だから、私はそれらを探すだけではいけません。

関連する問題