2014-10-12 211 views
1

我被卡住了。並不是說我是一個正則表達式,事實上恰恰相反。但我無法解決看似明顯的任務。使用正則表達式從字符串中提取標籤

原始字符串:

tag:tag1; tag:tag2;tag:tag3; tag:tag4 

我需要提取標籤,即「標籤」之間的一切,接下來的分號(或行的最後標記的結束)。迄今爲止我能得到的最好的結果是:

{tag:(?P<tag>[^;]+)(;|$)}i 

即,從「tag:」開始,然後允許除分號之外的任何符號,然後以分號或行尾結束。並做不區分大小寫的匹配。但隨着雙方preg_matchpreg_match_all,我只得到與此正則表達式:(

另一種第一標籤(但不循環)方法來實現我想要什麼,一個標籤的字符串數組,用PHP也算。

+1

你的正則表達式和'preg_match_all()'工作就好了。 – mario 2014-10-12 12:46:18

+0

我未能重現此行爲。 – Unihedron 2014-10-12 12:47:11

+0

不能刪除標籤:然後使用explode(「;」,$ string); ? – 2014-10-12 12:47:23

回答

1

在這裏工作罰款:

$text = 'tag:tag1; tag:tag2;tag:tag3; tag:tag4'; 
preg_match_all('{tag:(?P<tag>[^;]+)(;|$)}i', $text, $matches); 
print_r($matches['tag']); 

輸出:

Array 
(
    [0] => tag1 
    [1] => tag2 
    [2] => tag3 
    [3] => tag4 
) 
+0

奇怪的分隔符'{'和'}'。我不知道這是可能的。 – Rudie 2014-10-12 13:24:51

+0

保羅,真棒,非常感謝!我正在嘗試使用http://preg_match_all.onlinephpfunctions.com/並以某種方式無法正常工作。 – texnic 2014-10-12 13:53:58

+0

@Rudie:你爲什麼不喜歡我的分隔符? :)在通常的語言裏我找不到任何可能性不大的東西。 – texnic 2014-10-12 13:54:32

1

使用str_replace()函數+爆炸(),像耶勒科澤爾建議。

<?php 
    $text = 'tag:tag1; tag:tag2;tag:tag3; tag:tag4'; 

    $text = str_replace(array('tag:', ' '),array('', ''), $text); 
    $array = explode(';', $text); 

    var_dump($array); 

輸出:

Array 
(
    [0] => tag1 
    [1] => tag2 
    [2] => tag3 
    [3] => tag4 
) 
+0

感謝您的建議。我比較喜歡regex,因爲它可以確保標籤中的空格是可能的。 – texnic 2014-10-12 13:53:04

相關問題