PHP preg_match_all问题

时间:2011-05-19 16:25:21

标签: php regex preg-match preg-match-all

我对一个让我悲伤的常规功能有疑问。我有一个在标签中分隔的项目列表。我试图提取两个特定标签之间的所有内容(多次出现)。以下是我正在解析的列表示例:


<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 />";
}

我该如何解决这个问题?

4 个答案:

答案 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 parserPHP 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] => 
)