【问题标题】:PHP preg_match_all issuePHP preg_match_all 问题
【发布时间】:2018-09-29 12:12:12
【问题描述】:

所以我编写了一个小脚本,它会登录到我的电子邮件并在每封邮件中搜索某些链接。当电子邮件是/具有 HTML 正文时,一切工作都很棒,一切都很好……但是,当电子邮件是 TEXT 时,存在某种差异,导致无法找到匹配项。

这是我转义链接模式以检查电子邮件的方法。我的变量占位符是 *.

 $found = false;
 $escape = array('\\','/','(', ')', '?', '&');
 for ($i = 0; $i < $link_count; $i++) {
     foreach ($escape as $e){
        $links[$i] = str_replace($e, "\\$e", $links[$i]);
        $links[$i] = str_replace('*', '.*', $links[$i]);
      }
 }

 while (true) {
 $index = strpos($body, 'http://');

if ($index === false){
        break;
    }

$body = substr($body, $index);
$part = explode('"', $body, 2);
$part = explode(' ', $part[0], 2);
$part = explode("\n", $part[0], 2);
$part = explode("'", $part[0], 2);
$part = explode("<", $part[0], 2);
$tag = trim($part[0]);

foreach ($links as $link) {
    preg_match_all("/$link/", $tag, $matches, PREG_SET_ORDER);

    foreach ($matches as $match) {
        $found = true;
    }
}

来自 HTML 电子邮件 这被发现是匹配的: http://knowndomain.com/something.php\?id=......\&md=......\&mu=......*--> http://matchingdomain.com/couldbe.php?id=1&md=2&mu=tr

但在文本电子邮件中,同样的检查失败

我的问题是我到底想念什么。检查前的所有输出都一样!?

【问题讨论】:

  • 您的短信是否使用quoted-printable encoding ?您可能需要先检测它是否是多部分消息并根据需要进行解码。
  • 文本邮件未使用带引号的可打印编码
  • 运行正则表达式时,$tag 中的链接是否存在?
  • 是的,它们在 $tag 变量中。
  • 出现问题时能否请您添加$link$tag 的值?

标签: php regex preg-match-all


【解决方案1】:

所以我发现问题可能不是..它确实与我认为的 HTML 或文本电子邮件没有任何关系..实际上每个链接都有细微的差异。

所以我删除了 $links[$i] = str_replace('', '.', $links[$i]);从我的 excape 循环中并将其放在 preg_match 之前。

经过测试并且有效,所以我现在不会质疑这个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-15
    • 1970-01-01
    • 1970-01-01
    • 2013-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-12
    相关资源
    最近更新 更多