Preg_match帮助。无法从电子邮件中读取字符串。

时间:2011-11-01 15:53:39

标签: php regex email

我有一个脚本正在阅读电子邮件并从电子邮件中提取信息并将其保存到我的sql数据库中。但是,它不会插入任何与电话号码有关的信息。

这是我确定电话号码的代码:

if (preg_match('|^<b>Phone(.*)>\s*(\S*)<?|U', $lines[$i], $matches)) {
    $phone = trim($matches[2]);
}

示例电子邮件将是这样的:

Name: Joe Schmoe

E-mail Address: joeschmoe@joeschmoe.com

Phone: 555-555-5555

以下是电子邮件提供的来源示例:

    <b>Phone:</b> 555-555-5555</font><br> –

似乎$phone变量最终为空或为null,因为它没有插入数据库中,但我的所有其他信息都是..

有关此事的任何建议吗?

3 个答案:

答案 0 :(得分:1)

这是一个清理正则表达式,应该为你做的伎俩。它允许数字序列可选地用空格或连字符分隔:

$re = '% # Rev:20111101
    # Match phone number after "phone:</br>".
    phone:      # Literal text: "phone:".
    \s*         # Optional (zero or more) whitespace.
    </br>       # Literal text: "</br>".
    \s*         # Optional whitespace.
    (           # Capture group $1:
      [0-9]+    # {normal+} One or more digits.
      (?:       # Group for optional digit separators.
        [ -]    # {special} Digit separator.
        [0-9]+  # {normal+} More one or more digits.
      )*        # End {(special normal+)*} construct.
    )           # End $1: Phone number.
    \s*         # Optional whitespace.
    <           # Ensure number followed by literal "<".
    %ix';       // Use 'x'-free-spacing and 'i'-case-insensitive mode.
if (preg_match($re, $lines[$i], $matches)) {
    $phone = $matches[1];
}

不要使用U ungreedy修饰符!

使用U ungreedy修饰符不是最佳实践 - 应始终避免使用它。当您需要使单个量词器变得懒惰时,只需将?修饰符添加到特定量词。请注意,永远不需要或保证使用U模式修饰符 - 它所做的一切都会让读者感到困惑。

编辑2011-11-01 3:14 pm MDT “打破”正则表达式,通过在自由间距模式下重写它并添加了许多o-comments。

答案 1 :(得分:0)

您的第一个(.*)在贪婪模式下匹配 - 您可能会发现从Phone开始到字符串中最后一个>的字符串中的所有文字都已被玷污由该捕获组组成并位于$matches[1]

模式中的<b>是否表明您正在使用HTML字符串?你不应该在HTML上使用正则表达式,因为它们可以/将会爆炸你。使用DOM代替查找电话号码节点,然后提取节点的文本内容。然后,您可以使用简单的子字符串表达式将电话号码文本拆分为Phone:555-555-5555

答案 2 :(得分:0)

如果没有涉及html标签,我会尝试更可靠的东西

| \ bPhone:\ S +(\ S *)|