Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从出现在特定字符后的字符串中提取特定文本_Php_String - Fatal编程技术网

Php 从出现在特定字符后的字符串中提取特定文本

Php 从出现在特定字符后的字符串中提取特定文本,php,string,Php,String,我试图从下面的字符串中提取某些信息。我试过使用explode(这很有效),但这是一个有点冗长的过程。我想知道是否有一种更简单、更合乎逻辑的方法来做这件事 字符串的一个示例: string(778)“自动提醒定期维护计划 你有保养计划吗 车辆:357207058078957 任务:服务NA61 HNB 规则:每10英里或完成后每1个月。 任务标记为已完成时将重复执行 最后一次执行: 计划日期:2013年11月23日或50720英里 到期日:45天后或50719英里 提醒:2013年11月22日或5

我试图从下面的字符串中提取某些信息。我试过使用explode(这很有效),但这是一个有点冗长的过程。我想知道是否有一种更简单、更合乎逻辑的方法来做这件事

字符串的一个示例:

string(778)“自动提醒定期维护计划
你有保养计划吗
车辆:357207058078957
任务:服务NA61 HNB
规则:每10英里或完成后每1个月。
任务标记为已完成时将重复执行
最后一次执行:
计划日期:2013年11月23日或50720英里
到期日:45天后或50719英里
提醒:2013年11月22日或50715英里
***这是一封自动生成的电子邮件,请不要回复***
如果您对我们的产品和解决方案有疑问,您可以在我们的网站“常见问题”或“用户指南”下找到答案。
如果您需要联系我们的客户支持,请使用我们的在线联系表格。
“亲切问候”
我需要从这个例子中提取以下信息。此信息并不总是相同的,但其前面的文本(“车辆:”,等)会相同

  • 车辆:357207058078957
  • 任务:服务NA61 HNB
  • 规则:每10英里或完成后每1个月。任务标记为已完成时将重复执行
  • 最后执行:(这里应该有一个日期,但有时可以为空)
  • 计划日期:2013年11月23日或50720英里
  • 到期日:45天后或50719英里
  • 提醒:2013年11月22日或50715英里
(注意:这不是真实数据。)

除此之外,其余的都可以忽略不计


他们是否还保留第一个位(例如车辆:)没有区别,我可以自己轻松地删除该位。

我清理了所有内容,最后的正则表达式是:

/Vehicle:(.*?)\nTask:(.*?)\nRule:(.*?)\nLast excuted:(.*?)\nScheduled for:(.*?)\nDue:(.*?)\nReminder:(.*?)\n\*/s
细分:

()
中的内容称为匹配组。因此,我们查找
车辆:
,然后将
(所有内容)匹配为
*
(0+次)。这里需要
来进行这些惰性匹配,而不是贪婪匹配。因此
*
在遇到以下字符时停止运行
\n任务:
。这会一直持续到最后,在那里我们会得到所有的东西,直到后面的
\*
(一个转义的*)。不要忘记末尾的
/s
修饰符,它允许
匹配所有内容,包括换行符

要在PHP中实现这一点,您需要执行以下操作:

<?php
$string = <<<EOT
Automatic reminders periodic maintenance schedule

You have a maintenance schedule
Vehicle:          357207058078957
Task:             Service NA61 HNB
Rule:             Every 10 mi or every 1 months after completion.
                     Task repeats when it is marked as completed
Last excuted:     
Scheduled for:    23/11/2013 or 50720 mi
Due:              since 45 d or in 50719 mi
Reminder:         22/11/2013 or 50715 mi

*** This is an automatically generated email, please do not reply. ***

If you have a question about our products and solutions, you can find your answer on our website under " frequently asked questions " or under "user guides ".

If you need to contact our Customer Support, please use our online contact form.

Kind regards
EOT;

if(preg_match('/Vehicle:(.*?)\nTask:(.*?)\nRule:(.*?)\nLast excuted:(.*?)\nScheduled for:(.*?)\nDue:(.*?)\nReminder:(.*?)\n\*/s', $string, $matches)) {
    unset($matches[0]); // $matches[0] contains the whole matches string

    // Update the keys to something more logical
    $keys = array('vehicle', 'task', 'rule', 'last_executed', 'scheduled_for', 'due', 'reminder');
    $data = array_combine($keys, $matches);

    // Trim the values, since we lazy selected in RegEx
    // Note: you may want to do something more complicated, since `rule` still has whitespace
    $data = array_map('trim', $data);

    print_r($data);
    // Array (
    //   [vehicle] => 357207058078957
    //   [task] => Service NA61 HNB
    //   [rule] => Every 10 mi or every 1 months after completion. Task repeats when it is marked as completed
    //   [last_executed] =>
    //   [scheduled_for] => 23/11/2013 or 50720 mi
    //   [due] => since 45 d or in 50719 mi
    //   [reminder] => 22/11/2013 or 50715 mi
    // )
}
?>


要了解更多信息,请阅读。

虽然Sam的解决方案更干净,但我不相信RegExpressions,哈哈

不管怎样,我没有看到这里的回复,但我还是把它打了出来,所以我想我还是会把它贴出来

$msg ="Automatic reminders periodic maintenance schedule You have a maintenance schedule Vehicle: 357207058078957 Task: Service NA61 HNB Rule: Every 10 mi or every 1 months after completion. Task repeats when it is marked as completed Last excuted: Scheduled for: 23/11/2013 or 50720 mi Due: since 45 d or in 50719 mi Reminder: 22/11/2013 or 50715 mi *** This is an automatically generated email, please do not reply. *** If you have a question about our products and solutions, you can find your answer on our website under \" frequently asked questions \" or under \"user guides\". If you need to contact our Customer Support, please use our online contact form. Kind regards,";
$var = explode(' ',$msg);
$count = 0;
$array_count = 0;
$track_count = true;
$doc = array();
foreach ($var as $word){

    switch ($word) {
        case 'Vehicle:':

            $doc[$array_count] = $var[$count].' '.$var[$count+1];
            $array_count++;
            break;
        case 'Task:':
            $doc[$array_count] = $var[$count].' ';
            $count++;
            for ($i=0; $i <3 ; $i++) { 
                $doc[$array_count] .= $var[$count+$i].' ';
            }
            $array_count++;
            break;
        case 'Rule:':
            $while_count = 0; // run away
            $doc[$array_count] = $word.' ';
            while($var[$count].' '.$var[$count+1] != "Last excuted:"  && $while_count < 30){
                $doc[$array_count] .= $var[$count ].' ';
                $while_count++;
                $count++;
        }
        unset($while_count);
        $array_count++;
        $track_count = false;
        break;
    case 'Last':
        if($var[$count].' '.$var[$count+1] == 'Last excuted:'){
            $while_count = 0; // run away 
            $doc[$array_count] = $var[$count].' '.$var[$count+1];
            $count = $count+2; 
            while($var[$count].' '.$var[$count+1] != 'Scheduled for:'  && $while_count < 30){
                $doc[$array_count] .= $var[$count].' ';
                $while_count++;
                $count++;
            }
        unset($while_count);
        $array_count++;
        break;
        }
    case 'Scheduled':
        if($var[$count].' '.$var[$count+1] == 'Scheduled for:'){
            $while_count = 0; // run away 
            $doc[$array_count] = $word.' '.$var[$count+1].' ';
            $count = $count+2; 
            while($var[$count] != 'Due:'  && $while_count < 30){
                $doc[$array_count] .= $var[$count].' ';
                $while_count++;
                $count++;
            }
            unset($while_count);
        break;
        }
    case 'Due:':
        $while_count = 0; // run away 
        $doc[$array_count] = $word.' ';
        $count++;
        while($var[$count] != 'Reminder:'  && $while_count < 30){
            $doc[$array_count] .= $var[$count].' ';
            $while_count++;
            $count++;
        }
        unset($while_count);
        $array_count++;
        break;
    case 'Reminder:':
        $while_count = 0; // run away 
        $doc[$array_count] = $word.' ';
        $count++;
        while($var[$count] != '***'  && $while_count < 30){
            $doc[$array_count] .= $var[$count].' ';
            $while_count++;
            $count++;
        }
        unset($while_count);
        break;

}

if( $count < count($var)-1 && $track_count ){$count++;}

}
echo '<pre>';var_dump($doc);echo"</pre>";
/*
    array (size=6)
      0 => string 'Vehicle: 357207058078957' (length=24)
      1 => string 'Task: Service NA61 HNB ' (length=23)
      2 => string 'Rule: Every 10 mi or every 1 months after completion. Task repeats when it is marked as completed ' (length=98)
      3 => string 'Last excuted:' (length=13)
      4 => string 'Due: since 45 d or in 50719 mi ' (length=31)
      5 => string 'Reminder: 22/11/2013 or 50715 mi ' (length=33)
*/
$msg=“自动提醒定期保养计划您有保养计划车辆:357207058078957任务:维修NA61 HNB规则:每10英里或完成后每1个月。任务标记为已完成的最后执行时重复:计划日期:2013年11月23日或50720英里到期日期:自45天或50719英里提醒:2013年11月22日或50715英里***这是一封自动生成的电子邮件,请不要回复。***如果您对我们的产品和解决方案有疑问,您可以在我们的网站“常见问题”或“用户指南”下找到答案。如果您需要联系我们的客户支持,请使用我们的在线联系表格。“亲切问候”;
$var=爆炸(“”,$msg);
$count=0;
$array_count=0;
$track\u count=真;
$doc=array();
foreach($var作为$word){
开关($word){
案例“车辆:”:
$doc[$array_count]=$var[$count].'.$var[$count+1];
$array_count++;
打破
案例“任务:”:
$doc[$array_count]=$var[$count]。';
$count++;
对于($i=0;$i字符串“车辆:357207058078957”(长度=24)
1=>字符串“任务:服务NA61 HNB”(长度=23)
2=>string'规则:完成后每10英里或每1个月一次。任务标记为已完成时会重复(长度=98)
3=>字符串“上次执行:”(长度=13)
4=>字符串“到期日:自45天或在50719英里内”(长度=31)
5=>string'提醒:2013年11月22日或50715英里(长度=33)
*/

很高兴看到您找到了一个解决方案

只要文本在您感兴趣的数据周围保持相对静止,一系列正则表达式模式将使用这些信息。尝试或制作正则表达式。将其分为各个部分进行操作,然后您就可以将其组合成一个表达式。嗨,山姆,这听起来比大量分解要好得多不过,这在gskinner.com/RegExr上对我很有效(谢谢chris)但是它在PHP中不起作用,它只是显示一个空白页面……我想这是因为字符串可能略有不同-我只是简单地回显字符串并复制到这里,有没有办法将字符串按原样输出?@Smithey93可能有很多原因,但您能尝试执行
并更新您的问题吗?和@Smi他们93尝试我将
(.*)
更新为
(.*)
。这将生成选择器。嗨,山姆,请看-我也更新了问题:-)。更新,给我一些。