![](/img/trans.png)
[英]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.