preg_match整个XML文件?

时间:2017-11-23 21:02:39

标签: php regex xml preg-match

嘿,我有一点问题。我尝试为整个xml文件准备匹配指定的单词,但它没有工作

我的xml:

 <product>
    <title>TestProduct</title>
    <Specifications>
      <item name="Specifications1">Test</item>
      <item name="Specifications2">Hello World</item>
    </Specifications>
    <body>
      <item name="Color">Black</item>
    </body>
 </product>

我想从整个文件中预先找出某些单词。

我的php:

for ($i = 0; $i <= $length; $i++) {
   $var = $xml->product[$i];
   if (preg_match_all('/\b(\w*Test\w*)\b|\b(\w*Black\w*)\b/', $var, $result)){
      do something 
   }

但只有当我替换

时它才起作用
  $var->$xml->product[$i];

$var->$xml->product[$i]-> Specifications->item;

匹配测试

我如何解决我的想法 谢谢你的帮助!

2 个答案:

答案 0 :(得分:1)

不要乱用正则表达式,而是尝试使用解析器:

<?php

$xml = <<<DATA
 <product>
    <title>TestProduct</title>
    <Specifications>
      <item name="Specifications1">Test</item>
      <item name="Specifications2">Hello World</item>
    </Specifications>
    <body>
      <item name="Color">Black</item>
    </body>
 </product>
DATA;

# set up the DOM
$dom = new DOMDocument();
$dom->loadXML($xml);

# set up the xpath
$xpath = new DOMXPath($dom);

foreach ($xpath->query("*[contains(., 'Test')]") as $item) {
    print_r($item);
}
?>

这会产生Test作为文本的所有标记。

<小时/> 该代码段设置DOM并使用xpath查询来查找您可以循环的相应项目。 要想要查找多个字符串,请使用替换:

foreach ($xpath->query("*[contains(., 'Test') or contains(., 'Black')]") as $item) {
    print_r($item);
}

答案 1 :(得分:0)

优雅的方法是使用xpath,也像其他人建议的那样。

要严格回复您的正则表达式问题:您的问题似乎是由于preg_match_all默认情况下仅搜索主题的第一行这一事实。您可以使用s修饰符将其扩展到所有多行字符串:

preg_match_all('/\b(\w*Test\w*)\b|\b(\w*Black\w*)\b/s', $var, $result)