使用Php在多级重复xml标记之间提取文本

使用Php在多级重复xml标记之间提取文本,php,xml,regex,data-extraction,Php,Xml,Regex,Data Extraction,我试图在多层次XML标记之间提取文本。 这是数据文件 7117 10 0 1. NCID_1_457044331_130.14.22.215_9001_1401819380_1399850995 24887359 24884828 24884718 24884479 24882343 24879340 24871662 24870721 24864115 24863809 BRCA1[tiab] . . . 我只想提取中包含的标记之间的十个ID。 正则表达式只得到十个值中的第一个值。 p

我试图在多层次XML标记之间提取文本。
这是数据文件

7117
10
0
1.
NCID_1_457044331_130.14.22.215_9001_1401819380_1399850995
24887359
24884828
24884718
24884479
24882343
24879340
24871662
24870721
24864115
24863809
BRCA1[tiab]
.
.
.

我只想提取
中包含的
标记之间的十个ID。 正则表达式只得到十个值中的第一个值。
preg_match_all(“~(.+?)~”,$temp_str,$pids)
xml数据存储在$temp_Str变量中,我试图获取存储在$pids中的值
关于这方面还有其他建议吗?

您应该使用php的xpath功能,如下所述:

例如:

<?php
$xml = simplexml_load_file("searchdata.xml");
$result = $xml->xpath("IdList/Id");
print_r($result);
?> 
xpath(“IdList/Id”);
打印(结果);
?> 
XPath是灵活的,可以有条件地使用,并且在多种其他语言中也受支持。它也比正则表达式更可读、更容易编写,因为您可以不使用lookaheads来构造条件查询。

使用此模式
(?:\\\124;\ G)\s*(\d+)\
G
选项

使用preg\u match\u all(),我在
标记中包含了一个与数字匹配的正则表达式。最棘手的部分(我想)是在foreach循环中,在这里我迭代
$out[1]
。这是因为,从上面的URL

对结果进行排序,以便$matches[0]是完整模式的数组 matches,$matches[1]是由第一个匹配的字符串组成的数组 括号中的子模式,依此类推

preg\u match\u all('/\s*(\d+)\s*/'),
"
7117
10
0
1.
NCID_1_457044331_130.14.22.215_9001_1401819380_1399850995
24887359
24884828
24884718
24884479
24882343
24879340
24871662
24870721
24864115
24863809
BRCA1[tiab]
",
$out,预模式(订单);
foreach($out[1]为$o){
echo$o;
回音“\n”;
}
?>

不要使用PCRE解析XML。这里有CSS选择器和更好的Xpath来获取XML DOM的一部分

如果要在
eSearchResult

/eSearchResult/IdList[1]/Id

正如您所见,Xpath“知道”XML文档的实际结构。PCRE没有

您需要为DOM文档创建Xpath对象

$dom = new DOMDocument();
$dom->loadXml($xmlString);
$xpath = new DOMXpath($dom);

$result = [];
foreach ($xpath->evaluate('/eSearchResult/IdList[1]/Id') as $id) [
  $result[] = trim($id->nodeValue);
}
var_dump($id);

你能添加上面帖子中添加了regex的php代码吗?@mrk。我的数据在一个文件指针中。它是从Pubmed网站的在线搜索中检索到的。我所有的xml数据都在一个变量中。有没有办法在xpath功能中使用变量@stephen@Vignesh作为免责声明,我没有在这台机器上安装PHP,所以我无法完全测试这些代码片段。根据simplexml_load_文件的文档,您应该能够将URL传递到xml文件。请看这里:
$pattern=“(?:\ \124;\ G)\s*\(\d+”;preg_match_all($pattern,$string,$matches)这给了我意想不到的惊喜?错误如果我想搜索其他有字母数字多行句子的标记,我将如何调整这个正则表达式?假设WebEnv看起来是这样的:
NCID\u 1\u 457044331\u 130.14.22.215\u 9001\u 1401819380\u 1399850995 NCID\u 2\u 22222
,那么正则表达式,
'/\s*([0-9A-Za-z\\\\\n]+)\s*/code>就可以了。键是结束'/s'修饰符,用于切换到“单线”模式。在这里阅读更多关于正则表达式修饰符的内容:不需要
U
修饰符-它只会减慢匹配速度并使事情变得混乱。这是永远不需要的。换句话说:永远不要使用
U
ungreedy标志!
$dom = new DOMDocument();
$dom->loadXml($xmlString);
$xpath = new DOMXpath($dom);

$result = [];
foreach ($xpath->evaluate('/eSearchResult/IdList[1]/Id') as $id) [
  $result[] = trim($id->nodeValue);
}
var_dump($id);