【问题标题】:Issue while using preg_match_all inside loop over a column value在列值上使用 preg_match_all 内部循环时出现问题
【发布时间】:2021-03-02 07:14:33
【问题描述】:

我想将preg_match_all() 用于循环内的“msg”列值。

但在我的循环中,它不适用于所有“msg”列值,仅适用于最后一个。

以下是我写的代码:

$query = "SELECT email_id, msg FROM emailtry";
$result = mysqli_query($link, $query);
while ($obj = mysqli_fetch_object($result)){
    printf("%s (%s) \n\n\n",$obj->email_id, $obj->msg);
    $string = $obj->msg;
    
    if (is_array($result) || is_object($result) ){  
        foreach($result as $result){
            if (preg_match_all("/Dynamic Screen:\s+[A-Za-z0-9_-]+\s+[A-Za-z0-9_-]+/", $string, $notificationtype)){
                var_dump($notificationtype);
            }else{
                return false;
            }
            if (preg_match_all("/[A-Za-z0-9_-]+@[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+/", $string, $bodylogonused)){
                var_dump($bodylogonused);
            }else{
                return false;
            }
        }
    }
}

【问题讨论】:

  • 你不应该这样做:foreach($result as $result)。尝试给他们不同的名字。我不知道这是否会帮助您解决问题,但也许。
  • while 已经在执行时,那么其中的foreach() 需要什么?
  • 我已将此问题投票为“不清楚”。您的实际输出与您期望的输出没有清楚地表达出来。你是说$string 只保留最后一行的msg - 这是有道理的。如果您只是尝试访问$string,那么您的minimal reproducible example 不需要显示任何if (is_array(... ) 条件块。为什么你有一个循环中断return?我们不知道在哪里/为什么这对于提供的代码是一个好主意。如果您使用第二种模式搜索电子邮件地址,它不会捕获所有电子邮件地址。

标签: php arrays loops foreach preg-match-all


【解决方案1】:

while() 已经在执行时,那么其中的foreach() 需要什么?

像下面这样:

$query = "SELECT email_id, msg FROM emailtry";
$result = mysqli_query($link, $query);
while ($obj = mysqli_fetch_object($result)){
    if (preg_match_all("/Dynamic Screen:\s+[A-Za-z0-9_-]+\s+[A-Za-z0-9_-]+/", $obj->msg, $notificationtype)){
        var_dump($notificationtype);
    }
    if (preg_match_all("/[A-Za-z0-9_-]+@[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+/", $obj->msg, $bodylogonused)){
        var_dump($bodylogonused);
    }
}

注意:正如@mickmackusa 所建议的,在您的代码中使用[\w-] 而不是[A-Za-z0-9_-]。 (更简洁)

$query = "SELECT email_id, msg FROM emailtry";
$result = mysqli_query($link, $query);
while ($obj = mysqli_fetch_object($result)){
    if (preg_match_all("/Dynamic Screen:\s+[\w-]+\s+[\w-]+/", $obj->msg, $notificationtype)){
        var_dump($notificationtype);
    }
    if (preg_match_all("/[\w-]+@[\w-]+\.[\w-]+/", $obj->msg, $bodylogonused)){
        var_dump($bodylogonused);
    }
}

【讨论】:

  • @mickmackusa 我实际上并不擅长正则表达式,我所做的只是帮助 OP 纠正他的代码以使其正常工作。如果你有任何你可以发布答案。我会很感激的
  • @mickmackusa 感谢分享代码建议,并补充说,请你看看一切都很好。我的正则表达式真的很糟糕......谢谢
  • 好吧,正如我在问题下评论的那样,有一些有效的电子邮件地址不会被捕获。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-05
相关资源
最近更新 更多