关于php:preg_match_all没有找到regexp的出现

preg_match_all does not find occurrences of regexp

我有以下XML数据集:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<DOC>
<DOCNO>10022389_0.141</DOCNO>
<TEXT>
      15-Hydroxyprostaglandin Dehydrogenase: Cinderella Meets Prince Serendip          John W. Funder  
</TEXT>
</DOC>


<DOC>
<DOCNO>10022389_144.85</DOCNO>
<TEXT>
    Baker Medical Research Institute  Melbourne, Victoria, Australia 8008  
</TEXT>
</DOC>


<DOC>
<DOCNO>10022389_232.223</DOCNO>
<TEXT>
     Address correspondence and requests for reprints to: John W. Funder, Baker Medical Research Institute, Monash University, P.O. Box 6492, St. Kilda Road Central, Melbourne, Victoria, Australia 8008.
</TEXT>
</DOC>

<DOC>
<DOCNO>10022391_0.162</DOCNO>
<TEXT>
      Treatment of Resistance to Thyroid Hormone&#151;Primum Non Nocere          Roy E. Weiss and   Samuel Refetoff  
</TEXT>
</DOC>



<DOC>
<DOCNO>10022391_250.510</DOCNO>
<TEXT>
     Address correspondence and requests for reprints to: Roy E. Weiss, M.D., PhD, Thyroid Study Unit MC 3090, Department of Medicine, University of Chicago, 5841 S. Maryland Ave, Chicago, IL 60637.  E-mail:  rweiss{at}medicine.bsd.uchicago.edurweiss@medicine.bsd.uchicago.edu.'//-->
</TEXT>
</DOC>

我正在使用以下PHP代码查找上述数据集中的所有标记

1
2
$data = file_get_contents($dataset);
preg_match_all("|<TEXT>(.*)</TEXT>|s",$data,$out);

上面的代码取第一个事件并与最后一个事件匹配,并显示两者之间的所有内容(由于明显的原因,这是整个文档,不包括前2行和后2行)。

我怎样才能确保preg_match_all找到介于两者之间的事件?

我完全知道数据集不是有效的XML文件,但我无法重新格式化它,因此请避免留下与XML相关的注释。


regex并不真正适合解析,从长远来看,您最好使用DOMDocument,正如phpglue建议的那样。

但目前为止,.*是贪婪的,会尽量匹配。因此,把第一个和最后一个之间的所有内容进行匹配是有意义的。如果您不想这样做,请使用.*?