【问题标题】:PHP Regex for splitting a string at the first occurrence of a characterPHP Regex 用于在第一次出现字符时拆分字符串
【发布时间】:2011-03-29 15:12:21
【问题描述】:

这可能是一个蹩脚的问题,但我是一个正则表达式的新手。我有一些格式的文本数据:

公司名称:公司名称,地点。
公司地址:一些, 地址,这里。
链接: http://www.somelink.com

现在,我想使用正则表达式将它们拆分为名称数组:值对。我正在尝试的正则表达式是/(.*):(.*)/preg_match_all(),它在前两行中运行良好,但在第三行中,它在一部分中返回“链接:http:”和“//www.somelink.com”在其他。

那么,有没有办法只在第一次出现字符 ':' 时拆分行?

【问题讨论】:

  • 为什么不直接使用explode()php.net/manual/en/function.explode.php
  • ... 为什么是preg_match_all()?为什么不只是preg_match
  • 我想一步到位,这就是为什么 :) 一直在使用爆炸。
  • 好吧 preg_match_all() 正在读取多行... preg_match 只返回第一对。

标签: php regex preg-match preg-match-all


【解决方案1】:

使用否定字符类 (see on rubular.com):

/^([^:]*):(.*)$/m

[…]character class。像[aeiou] 这样的东西匹配任何一个小写元音。 [^…] 是一个 否定 字符类。 [^aeiou] 匹配小写元音之一。

模式开头和结尾处的^$anchors 行的开头和结尾。 m 修饰符打开multi-line mode

您的原始模式的问题在于,您(ab)使用.,而您本来可以更具体一些,并且由于* 是贪婪的,所以第一组被过度匹配。尝试通过使重复不情愿来“解决”这个问题很诱人,但MUCH最好更具体一点,并说第一组匹配除:之外的任何内容。

但是请注意,这是一个 匹配 模式,带有捕获。它实际上不是仅匹配分隔符的 拆分 模式。分隔符模式真的只是:

相关问题


PHP sn-p

鉴于此:

$text = <<<EOT
Company Name: Name of the company, place.
Company Address: Some, address, here.
Link: http://www.somelink.com
EOT;

preg_match_all('/^([^:]*):(.*)$/m', $text, $matches, PREG_SET_ORDER);

print_r($matches);

输出是(as seen on ideone.com):

Array
(
    [0] => Array
        (
            [0] => Company Name: Name of the company, place.
            [1] => Company Name
            [2] =>  Name of the company, place.
        )

    [1] => Array
        (
            [0] => Company Address: Some, address, here.
            [1] => Company Address
            [2] =>  Some, address, here.
        )

    [2] => Array
        (
            [0] => Link: http://www.somelink.com
            [1] => Link
            [2] =>  http://www.somelink.com
        )

)

【讨论】:

  • 感谢您的快速回复......它可以工作,但在字符串之前给了我很多空字符,前一个工作正常。
  • @aadravid:查看最新版本。我想我终于弄清楚了你的确切要求。
  • +1 有机会再看一遍,我实际上同意这个最新版本可能是一个更好/更安全的正则表达式。我当时只是没想到这样做。
  • 感谢 polygenelubricants,这确实比第一个更好。但我已经实施了 eldarerathis 解决方案。但以后会记住你的:)
【解决方案2】:

您可能想要/(.*?):(.*)/ 之类的东西。在* 之后的? 将使其“非贪婪”,因此它将以这种方式消耗尽可能少的文本。我认为这将适用于您的情况。默认情况下,* 是“贪婪的”,并尝试匹配尽可能多的重复。

编辑:有关使用*+ 运算符匹配重复的更多信息,请参阅here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-12
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    • 1970-01-01
    • 2021-01-29
    相关资源
    最近更新 更多