繁体   English   中英

PHP Regex用于在首次出现字符时拆分字符串

[英]PHP Regex for splitting a string at the first occurrence of a character

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

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

现在,我想使用正则表达式将它们拆分为name:value对的数组。 我尝试使用的正则表达式是/(.*):(.*)/preg_match_all() ,它与前两行效果很好,但在第三行中它部分返回“ Link:http:”,而“ //www.somelink.com”中的其他内容。

因此,有什么方法仅在字符':'首次出现时才拆分行吗?

使用否定的字符类( 请参见rubular.com ):

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

[…]是一个字符类 [aeiou]类的东西与任何小写元音之一匹配。 [^…]是一个否定的字符类。 [^aeiou]匹配小写元音以外的任何一个。

模式开头和结尾的^$是行的开头和结尾。 m修饰符打开多行模式

原始模式的问题是您正在(滥用) . 当您本可以更加具体一些时,并且由于*是贪婪的,因此第一组过匹配。 这是很有诱惑力的尝试“修复”,通过使重复舍不得,但是这更好更具体的说,第一组是匹配什么,但:

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

相关问题


PHP片段

鉴于这种:

$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);

输出为( 如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
        )

)

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

编辑:有关使用*+运算符进行重复匹配的更多信息,请参见此处

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM