【问题标题】:how do i extract data from string (php) using preg_match?如何使用 preg_match 从字符串 (php) 中提取数据?
【发布时间】:2012-09-19 08:48:09
【问题描述】:

我有一个字符串,

   DXD RO 012345 SMITH JOHN 094 5251 907 REQ 008313 M 

我正在尝试提取可能有 5-15 位数字的电话号码,其中包含未知数量的空格。我还需要最后一个字母(性别)和名字。

这样做的确切模式是什么?

【问题讨论】:

  • 您自己尝试过吗?对此没有通用答案,除非我们能看到这种数据格式的规范。为这个特定的文本示例提供一个特定的正则表达式很容易,但我猜文本会发生变化,所以答案可能适用于您的实际情况,也可能不适用。
  • 我自己尝试了几件事,但由于我是 php 新手,我都失败了。我知道我试图做的事情在 c 中是可能的。数据格式相当固定: [word] ,whitespace, [word] ,whitespace, [number] ,whitespace [name(可能包含少量空格)], whitespace, [phone-number(may contains whitespaces) ] ,whiespace, [ word] , whitespace, [number], whitespace, [char]

标签: php string pattern-matching preg-match


【解决方案1】:
$subject = "DXD RO 012345 SMITH JOHN 094 5251 907 REQ 008313 M";
$pattern = "/[a-z]+\s+[a-z]+\s+\d+\s+[^\d]+\s*(\d+\s*\d+\s*\d+)\s+[a-z\-]+\s+\d+\s+([a-z])/i";

preg_match($pattern, $subject, $matches);

$matches[1] 包含电话号码,$matches[2] 包含性别。

为此,我假设第 1、2、4、5 和 9 列仅包含字母,而 3、6、7、8、10 仅包含数字(性别必须是字母)。

但是,如果您需要数字和字母,只需将 [a-z]\d 替换为 [a-z0-9] 对应列(\s 是空格)

【讨论】:

  • 这个正则表达式太具体了。 “可能有 5-15 位数字,包含未知数量的空格”...
  • 我对它做了一点修改,所以它符合规格。谢谢
  • 非常感谢弗拉德,它在 99% 的情况下都有效,除了那些在第 9 列单词中带有字符“-”的单词,“-”是一个特殊的字符吗?
  • 只是正则表达式是这样构建的。我已经对其进行了编辑,因此即使在第 9 列中有破折号时它也能正常工作。这就是为什么 deceze 要求提供一些数据的原因,我们必须知道每列将包含哪些字符范围。
  • 非常感谢,你真的帮助我理解了模式匹配的工作原理。
【解决方案2】:

对于手机你可以试试:

$subject = "DXD RO 012345 SMITH JOHN 094 5251 907 REQ 008313 M";
preg_match_all("/([0-9]|\s).+{5,15}(\s)/si", $subjectt, $matches);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多