2010-04-28 48 views
0

我很新的正則表達式,我已經學到的東西的方式,但仍然傾注知識!使用字符串模式,但排除它從刪除

所以我想問你澄清它是如何工作的!

假設我有以下字符串,正如你所看到的,它們可以被格式化爲一種不同的方式,但它們非常相似!

DTSTART;TZID="America/Chicago":20030819T000000 
DTEND;TZID="America/Chicago":20030819T010000 
DTSTART;TZID=US/Pacific 
DTSTART;VALUE=DATE 

現在我想取代一切第一AZ塊結腸之間因此,例如,我會保持

DTSTART:20030819T000000 
DTEND:20030819T010000 
DTSTART 
DTSTART 

所以我很菜鳥的知識,我已經制定了這低劣的正則表達式! :-(

preg_replace('/^[A-Z](?!;[A-Z]=[\w\W]+):$/m' , '' , $data); 

但爲什麼我敢肯定,這個表達式將無法正常工作!?:-)

請幫助我!

PS:問題的標題是相當explaned,我想也知道如何例如使用衆所周知的字符串塊匹配另一...

preg_replace('/^[DTSTART](?!;[A-Z]=[\w\W]+):$/m' , '' , $data); 

..無刪除DTSTART

謝謝爲時間!

問候 盧卡Filosofi

+0

感謝每一個人,只是在這裏很好的答案;所以我已經upvoted(+1)你們每個人!我想檢查** salathe **因爲我真的很喜歡他那優雅的'^ DT(?:START | END)'正則表達式!再次感謝所有! – 2010-04-28 16:03:08

回答

1

你可以使用一個相對簡單的正則表達式如下所示。

$subject = 'DTSTART;TZID="America/Chicago":20030819T000000 
DTEND;TZID="America/Chicago":20030819T010000 
DTSTART;TZID=US/Pacific 
DTSTART;VALUE=DATE'; 

echo preg_replace('/^[A-Z]+\K[^:\n]*/m', '', $subject) . PHP_EOL; 

它看起來在一個行的開始了一系列的大寫字母,重置比賽起點(這是\K做什麼)那些年底和匹配任何不是一個冒號或換行(即部分你想刪除)。那些匹配的部分將被替換爲空字符串。

從上面的輸出是

DTSTART:20030819T000000 
DTEND:20030819T010000 
DTSTART 
DTSTART 

如果你有興趣的線條將只與DTSTARTDTEND上啓動,然後我們就可以更精確地瞭解以匹配(如^DT(?:START|END)),但[A-Z]顯然涵蓋了這兩個。

1

要刪除一個分號和一個冒號,或者行結束之間的所有內容,對不對?所以用它作爲你的表情。你太過於複雜。

preg_replace('/(?:;.+?:)|(?:;.+?$)/m','',$data); 

這是一個非常簡單的表達。匹配(?:;.+?:)(?:;.+?$),它們只有終止符纔有區別(第一個匹配冒號,第二個匹配直到行尾)。

每個都是一個非捕獲組,以分號開頭,不情願地讀入所有字符,然後停在終止符處。與此相匹配的所有內容都可根據您的描述進行移除

1

如果你想在替換中保留匹配模式的一部分,你可以在它周圍放上圓括號,然後用$ 1引用它(或者將其分組)。

例如:

s/^(this is a sentence) to edit/$1/ 

給人 「這是一句」

1

您同樣可以看看這個例子作爲您的問題

\ w +):σ(P \ d +)/ ',$ str,$ matches); /*這也適用於PHP 5.2.2(PCRE 7.0)及更高版本,但是 *上述表單建議向後兼容*/ // preg_match('/(?\ w +):\ d +)/',$ str,$ matches); print_r($ matches); ?>
The above example will output: 

Array 
(
    [0] => foobar: 2008 
    [name] => foobar 
    [1] => foobar 
    [digit] => 2008 
    [2] => 2008 
) 

所以如果u只需要數字u需要打印$比賽[數字]