[英]Remove everything from the first occurrence of a character to the end of a string in PHP
[英]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
修饰符打开多行模式 。
原始模式的问题是您正在(滥用) .
当您本可以更加具体一些时,并且由于*
是贪婪的,因此第一组过匹配。 这是很有诱惑力的尝试“修复”,通过使重复舍不得,但是这是更好的更具体的说,第一组是匹配什么,但:
。
但是请注意,这是带有捕获的匹配模式。 它实际上不是仅与分隔符匹配的拆分模式。 分隔符模式确实是:
。
鉴于这种:
$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.