我对一个让我悲伤的常规功能有疑问。我有一个在标签中分隔的项目列表。我试图提取两个特定标签之间的所有内容(多次出现)。以下是我正在解析的列表示例:
<ResumeResultItem_V3>
<ResumeTitle>Johnson</ResumeTitle>
<RecentEmployer>University of Phoenix</RecentEmployer>
<RecentJobTitle>Advisor</RecentJobTitle>
<RecentPay>40000</RecentPay>
</ResumeResultItem_V3>
<ResumeResultItem_V3>
<ResumeTitle>ResumeforJake</ResumeTitle>
<RecentEmployer>APEX</RecentEmployer>
<RecentJobTitle>Consultant</RecentJobTitle>
<RecentPay>66000</RecentPay>
</ResumeResultItem_V3>
我正在尝试将“ResumeResultItem_V3”之间的所有内容作为一个文本块,但我似乎无法使表达正确。
这是我到目前为止的代码:
$test = "(<ResumeResultItem_V3>)";
$test2 = "(<\/ResumeResultItem_V3>)";
preg_match_all("/" . $test . "(\w+)" . $test2 . "/", $xml, $matches);
foreach ($matches[0] as $match) {
echo $match;
echo "<br /><br />";
}
我该如何解决这个问题?
答案 0 :(得分:2)
我正在假设你的XML结构,但我真的认为你需要一个使用XML解析器的例子,比如SimpleXML。
$xml = new SimpleXMLElement( $file );
foreach( $xml->ResumeResultItem_V3 as $ResumeResultItem_V3 )
echo (string)$ResumeResultItem_V3;
答案 1 :(得分:1)
忽略您probably ought to use an XML parser和PHP has one you can use ...
问题是\w+
匹配单词字符,而不是任何字符。空格和大多数标点符号不是单词字符,因此您的匹配失败。你需要匹配“任意”字符.
和+
一样多,但因为你可能能够过分分组,你需要一个修饰符来使它变得非贪婪,{{1 }}。如果您将?
更改为\w+
,则表达式应该有效 - 任何字符匹配也需要.+?
修饰符,因此:
s
答案 2 :(得分:1)
最好使用simplexml
来提取数据。
但也要回答正则表达式的问题。 \w+
仅匹配单词字符。但是在这种情况下,你希望它几乎匹配分隔符之间的所有内容,.*?
可以用于。{/ p>
preg_match_all("/$test(.*?)$test2/s", $xml, $matches);
仅适用于/s
修饰符。
答案 3 :(得分:1)
如果您可以将输出用作每个“text blob”匹配的1个项目的数组,请尝试以下操作:
<?php
$text =
"<ResumeResultItem_V3>
<ResumeTitle>Johnson</ResumeTitle>
<RecentEmployer>University of Phoenix</RecentEmployer>
<RecentJobTitle>Advisor</RecentJobTitle>
<RecentPay>40000</RecentPay>
</ResumeResultItem_V3>
<ResumeResultItem_V3>
<ResumeTitle>ResumeforJake</ResumeTitle>
<RecentEmployer>APEX</RecentEmployer>
<RecentJobTitle>Consultant</RecentJobTitle>
<RecentPay>66000</RecentPay>
</ResumeResultItem_V3>";
$matches = preg_split("/<\/ResumeResultItem_V3>/",preg_replace("/<ResumeResultItem_V3>/","",$text));
print_r($matches);
?>
结果:
Array
(
[0] =>
<ResumeTitle>Johnson</ResumeTitle>
<RecentEmployer>University of Phoenix</RecentEmployer>
<RecentJobTitle>Advisor</RecentJobTitle>
<RecentPay>40000</RecentPay>
[1] =>
<ResumeTitle>ResumeforJake</ResumeTitle>
<RecentEmployer>APEX</RecentEmployer>
<RecentJobTitle>Consultant</RecentJobTitle>
<RecentPay>66000</RecentPay>
[2] =>
)