在preg_match_all之后,如果值在另一行中,如何获取该值

时间:2018-12-17 10:39:28

标签: php mysql

我的任务是在提及特定单词时获得所需的日期。我想提一下“ pelpelbruk”的日期,所以我想要2014年7月29日,并且可以按我的意愿工作。

22/10/2013 ånger, ska bet 6,428:-, 
bet 6428, 2109+2016+2303 inlagt
23/5/2014 bl 26/5, medd inga avgifter) 
29/7/2014 spelmissbruk 
29/12/2014 föreslår godkänn
27/4/2016 Föreslår godkänn

我的问题是,在某些情况下,日期可能在另一行。

spelmissbruk 
29/7/2014 

这是代码im正在使用中提取所需的日期。任何提示将不胜感激。

  $subject = $row['anteckning'];


$pattern = $wordToFind;
        if(preg_match_all("/(\d{1,2}\/\d{1,2}\/\d{4}).*$pattern.*/i",$subject, $matches))  {

            $date = $matches[1][0];

        }

下面是一个日期的示例,该日期不会被保存为我想要的

            12/7/2018 -  kund ringer in, har fått hem fakturan men känner ej igen den. Kund uppger att det ej är han som tagit lånet. Kund har ej fått hem andra fakturor eller någon kreditupplysning. Swedbank hade hört av sig till kund och meddela tom ett belopp på 15000:- som hade kommit in på hans konto och sedan förts iväg igen till okänt konto. Meddelat att ansökan är identifierad.
Bett kund tag kontakt med sin bank, bisnode, polisanmälan och skicka polisanmälan till oss.

这就是我试图做的

 $move_date = preg_replace("(\d{1,2}\/\d{1,2}\/\d{4})", "-", $subject)

$explodeDate = explode("-",$move_date);
        print_r($explodeDate);

我的想法是将其炸开,并介绍一些如何删除所有行的方法。

在这里,我有一个示例文本,其中列出了不保存日期的原因,这是因为行格式。我正在寻找的是“ polis”一词,如果是比赛停止并获得日期。

12/7/2018 - Sofi: kund ringer in, har fått hem fakturan men känner ej igen den. Kund uppger att det ej är han som tagit lånet. Kund har ej fått hem andra fakturor eller någon kreditupplysning. Swedbank hade hört av sig till kund och meddela tom ett belopp på 15000:- som hade kommit in på hans konto och sedan förts iväg igen till okänt konto. Meddelat att ansökan är identifierad.
Bett kund tag kontakt med sin bank, bisnode, polisanmälan och skicka polisanmälan till oss.

这是文本,它将根据需要保存日期

25/7/2018 - Sofi: detta är bedrägeri, kund son hade gjort bedrägeri på kund, kund har polisanmält, spärrat sin bankdosa osv. Pengarna finns kvar på kunds konto, även ifrån andra bolag. Meddelat 25000:-, därefter slutbetalt. Kund betalar detta idag. Lagt in spärr på kunds begäran

2 个答案:

答案 0 :(得分:0)

首先,您需要使用s修饰符,以便.符号搜索多行匹配项。其次,请不要使用.*,因为在您的情况下,它只会始终匹配第一个日期。第三,使用preg_quote引用要查找的字符串中的特殊字符。

作为一个完整的示例,请尝试以下示例:

// To avoid errors or unexpected results, we must escape regex characters
// For example, without this we cannot find some punctuation marks
$search = preg_quote('polis', '#');

// A simple regular expression to find the date
// Since we have to use it twice, we do not repeat ourselves
$date_rgxp = '\d{1,2}/\d{1,2}/\d{4}';

// Now it’s time to capture our date, for this we are using a more complex regex
// - Use "#" as delimiter, as it will allow do not escape "/" from the $date_rgxp
// - Use a named group to capture the date (it can be written as "($date_rgxp)", but in this case we should print it as "$m[1]" which is not so good for readability)
// - There can be any characters between the date and search word, but it should not contain another date (to solve this we are using negative lookahead "(?:(?!{$date_rgxp}).)+" instead of ".*")
// - Use the "si" modifiers to perform a case-insensitive multi-line search
if (preg_match("#(?P<date>{$date_rgxp})(?:(?!{$date_rgxp}).)+{$search}#si", $subject, $m)) {
    echo $m['date'];
}

答案 1 :(得分:0)

这里是有效的代码,我已经用三种情况进行了测试:

  1. 案例1,前面的日期,您已经做了。
  2. 第2种情况,最后的日期,我只是对第一个做了一些小的修改。
  3. 第3种情况,日期在新行中,下面对此进行了说明。

preg_match_all有一个名为PREG_OFFSET_CAPTURE的标志,该标志将返回捕获的模式的偏移量,然后同一函数具有可以设置的offset参数,所以我要做的就是搜索模式对于情况1和2,如果未找到,则使用PREG_OFFSET_CAPTURE搜索模式,然后进行第二次搜索,这次使用PREG_OFFSET_CAPTURE标志的输出作为偏移量,并返回日期为该行中唯一的

希望此解决方案可以为您提供帮助。

<?php

    $subject = "22/10/2013 ånger, ska bet 6,428:-, 
    bet 6428, 2109+2016+2303 inlagt
    23/5/2014 bl 26/5, medd inga avgifter) 
     spelmissbruk 
     29/7/2014
    29/12/2014 föreslår godkänn
    27/4/2016 Föreslår godkänn
    CUSTOM TESTx 27/12/2018
    27/12/2018 - CUSTOM TEST 
    TESTVAL
    05/12/1987";
    $pattern = '- CUSTOM';
    $search = TRUE;

        /*Make sure you are searching a valid pattern*/
        if(!preg_match_all("/.*$pattern.*/",$subject, $matches)){
            echo "NO PATTERN MATCH";

        }
        /*Search the case that the date infront of the text*/
        if(preg_match_all("/(\d{1,2}\/\d{1,2}\/\d{4}).*$pattern.*/i",$subject, $matches))  {
            $date = $matches[0][0][0];

        }
        /*Search the case that the date is after the text*/
        if(preg_match_all("/.*$pattern.*(\d{1,2}.\/\d{1,2}\/\d{4})/",$subject, $matches))  {
            //echo "MATCH LAST";
            $date = $matches[0][0][0];
        }
        if(preg_match_all("/.*$pattern.*/",$subject, $matches,PREG_OFFSET_CAPTURE )){
            //echo " CAPTURED OFFSET ".$matches[0][0][1];
            if(preg_match_all("/(\d{1,2}.\/\d{1,2}\/\d{4})/",$subject, $dateMatches,PREG_OFFSET_CAPTURE,$matches[0][0][1]))  {
                //echo " CAPTURED OFFSET DATE";
                $date = $dateMatches[0][0][0];
            }

        }

    if(isset($date)){
        echo $date;
    }



    ?>