Preg_match列表中的项目

时间:2016-04-19 17:13:32

标签: regex preg-match

编辑:下面的答案和评论使我认为我没有清楚地解释这一点......我正在寻找一个匹配列表多次出现的正则表达式。例如,我可能想要使用ABCBCBCBCBCD,我想从中获取数组[BC,BC,BC,BC,BC]。我不知道列表中有多少项。如果它是ABCD,我想要列表[bc]。如果是ABCBCD,我想要[bc,bc]。我可以使用/ A(BC)+ D /匹配所有出现的BC,但这不起作用。

最初的问题......

我有一组非常大的数据文件。每个文件,我只想要一个项目列表。我正在寻找的信息格式为:

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

...表示此集合之前和之后有大量文本。我可以轻松地使用正则表达式列出第一个项目

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

然后,$ matches [1]有#34;阿莫西林,&#34;。我尝试使用以下命令获取列表中的所有匹配项:

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

这不起作用。我没有比赛。 &#34;和(和)&#34;?

之间前一个序列的多个匹配是什么语法

值得注意的是,这就是$ 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>
)

2 个答案:

答案 0 :(得分:0)

这是你在找什么?

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

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

答案 1 :(得分:0)

经过大量研究后,似乎无法使用单个preg_match函数完成此操作。它需要两次通过。第一个将从列表的开头到结尾拉出整个匹配。第二个会将列表分成所需的匹配项。

第一次通过(假设$ s = ...&lt; RXCUI&gt;&lt; LN ID = 531123&gt;阿莫西林&lt; / LN&gt;,&lt; LN ID = 441656&gt; Amikacin&lt; / LN&gt;&lt; / ERS&gt; .. 。)

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

现在,$ match1 [0] =&lt; RXCUI&gt; &lt; LN ID = 531123&gt;阿莫西林&lt; / LN&gt;,&lt; LN ID = 441656&gt;阿米卡星&lt; / LN&gt;&lt; / ERS&gt; 我可以使用preg_match_all来获得我想要的RXCUI和ERS元素之间的内容

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

现在,$ match2 [0]将包含一个数组:

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

有多少LN线并不重要,第二个preg_match_all将全部返回。

如果您可以确保原始文档中的其他任何位置都没有LN元素,那么这可以简化很多。我知道它们是LN元素,不属于RXCUI部分。所以,我不能只寻找那些。