1. preg_match_all()

preg_match_all("/匹配模式/",$字符串,$匹配结果);

1.1 $匹配结果

匹配出来的结果存储在多维数组中,从多维数组中获取匹配结果的方式如下:

1.1.1 如果不含()子表达式

如果匹配模式中不含()子表达式的话,所有匹配结果都存储在返回结果第一个维度的第一个元素中,即:

$匹配结果[0][0];
$匹配结果[0][1];
$匹配结果[0][2];
1.1.2 如果含()子表达式

如果匹配模式不含()子表达式的话,整体匹配结果存储在返回结果第一个维度的第一个元素中;子表达式的匹配结果则顺延至返回结果的第一个维度的第二个、第三个...元素中,即:

//整体匹配结果
$匹配结果[0][0];
$匹配结果[0][1];
$匹配结果[0][2];
//第一个子表达式匹配结果
$匹配结果[1][0];
$匹配结果[1][1];
$匹配结果[1][2];
//第二个子表达式匹配结果
$匹配结果[2][0];
$匹配结果[2][1];
$匹配结果[2][2];

1.2 $字符串

$字符串必须在一行中。如果不在一行,则再匹配是需要考虑换行符\r\n的问题。

2. 任务描述

通过PHP的SOAP获得了一个XML的字符串,需要对这个XML字符串中的内容进行提取。XML字符串内容如下:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"/>
    <soap:Body>
        <dbs:resultset xmlns:dbs="http://www.royotech.com/">
        <record>
            <float_id>95551e1d7bf9430d80361a0d21d13cd3</float_id>
            <float_name>张三</float_name>
            <float_sex>男</float_sex>
            <float_native>北京市东城区</float_native>
            <float_card>110102199008080808</float_card>
            <float_address>福建省莆田区</float_address>
            <float_unit>福州市美术设计制作有限公司</float_unit>
            <float_unit_adress>福建省莆田区</float_unit_adress>
            <float_job>销售</float_job>
            <float_states>0</float_states>
        </record>
        <record>
            <float_id>be7b91fed02641108ddb612bf15de26c</float_id>
            <float_name>李四</float_name>
            <float_sex>男</float_sex>
            <float_native>北京市东城区</float_native>
            <float_card>110103199106060606</float_card>
            <float_address>新乡市</float_address>
            <float_unit>新乡市电子技术有限公司</float_unit>
            <float_unit_adress>新乡市</float_unit_adress>
            <float_job>IT开发</float_job>
            <float_states>0</float_states>
        </record>
        </dbs:resultset>
    </soap:Body>
</soap:Envelope>

3. 代码

<?php
    $xml = '<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"/><soap:Body><dbs:resultset xmlns:dbs="http://dbservices.tongtech.com/"><record><float_id>95551e1d7bf9430d80361a0d21d13cd3</float_id><float_name>庄正卿</float_name><float_sex>男</float_sex><float_native>北京市东城区</float_native><float_card>110101199003077950</float_card><float_address>福建省莆田区</float_address><float_unit>福州市益聚美术设计制作有限公司</float_unit><float_unit_adress>福建省莆田区</float_unit_adress><float_job>销售</float_job><float_states>0</float_states></record><record><float_id>be7b91fed02641108ddb612bf15de26c</float_id><float_name>逯俊郎</float_name><float_sex>男</float_sex><float_native>北京市东城区</float_native><float_card>110101199003078793</float_card><float_address>新乡市</float_address><float_unit>新乡市欣丰电子技术有限公司</float_unit><float_unit_adress>新乡市</float_unit_adress><float_job>IT开发</float_job><float_states>0</float_states></record></dbs:resultset></soap:Body></soap:Envelope>';

    $records = null;
    preg_match_all("/\<record\>.*?\<\/record\>/",$xml,$records);

    $tags = [   "inspect_id",
                "report_time",
                "recorder_name",
                "report_name",
                "report_dex",
                "report_card",
                "report_phone",
                "report_dec",
                "result",
                "inspect_states",
            ];

    foreach ($records as $record){
        foreach ($tags as $tag){
            echo $tag . " " . getTagInfo($tag,$record[0]) . "<br/>";
        }
    }

    function getTagInfo($tagName,$str){
        $arr_tag = "";
        preg_match_all("/\<".$tagName."\>(.*?)\<\/".$tagName."\>/",$str,$arr_tag);
        return $arr_tag[1][0];
    }
?>

发表评论

邮箱地址不会被公开。 必填项已用*标注