簡體   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