在preg\u match\u all之后,如果值在另一行中,如何获取该值

rqmkfv5c  于 2021-06-15  发布在  Mysql
关注(0)|答案(2)|浏览(257)

我的任务是在提到某个特定的词时得到所需的日期。我想要的日期,例如“斯佩尔米斯布鲁克”是提到,所以我想29/7/2014,这是我想要的工作。

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

这是我现在用来提取所需日期的代码。任何提示都将不胜感激。

$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);

我的身份证é一个方法是分解它,然后删除所有行。
在这里我有一个例子文本时,日期将不会被保存,这是因为行格式。我要找的是“波利斯”这个词,如果是比赛的话,就停下来看看日期。

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
cfh9epnr

cfh9epnr1#

首先,你需要使用 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'];
}
s4n0splo

s4n0splo2#

下面是我用三个案例测试的工作代码:
案例1,前面的日期,你已经做了。
案例2,最后的日期,我只是对第一个做了一点修改。
案例3,日期在新行中,解释如下。 preg_match_all 有个旗子叫 PREG_OFFSET_CAPTURE 它将返回捕获的模式的偏移量,然后同一个函数具有可以设置的偏移量参数,所以我所做的是,我搜索案例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;
    }

    ?>

相关问题