嘿,我有一点问题。我尝试为整个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;
匹配测试
我如何解决我的想法 谢谢你的帮助!
答案 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)