2011-07-17 117 views
1

我很努力去匹配我以奇怪的格式拍攝的幾部電影。其中一些標題用引號括起,一些以#$開頭,其中大多數以結束時的發行年結束(否則????)。用preg_match替換圓括號中的引號和單詞?

我試圖取代這個:

"Ein Engel für alle" (2005) {Katzenjammer (#2.5)} ???? 
#"Sospecha" (1963) {El caso del viejo del Tibet}  1963 
MTV Europe Music Awards 1998 (1998) (TV)  1998 
"Hotel Cæsar" (1998) {(#12.26)}    1998 
$Am Rande - Sechs Kapitel über AIDS in der Ukraine (2006) 2006 

...這樣的:

Ein Engel für alle, ???? 
Sospecha, 1963 
MTV Europe Music Awards 1998, 1998 
Hotel Cæsar, 1998 
Am Rande - Sechs Kapitel über AIDS in der Ukraine, 2006 

...如果可能的話,以某種方式獲取發行年份。在這個例子中,我只是放了一個逗號,但如果你不能得到發佈日期,就離開它,我會以另一種方式得到它。

我是一個在正則表達式中的完全新手,但我仍然試圖做到沒有運氣。如果有人能幫我一把,我會非常感激!


編輯

爲了使它不那麼混亂:

  1. 刪除一切包在(){}

  2. 刪除字符串開頭的$#

  3. 如果標題用引號括起來,請刪除它們。

  4. 要麼像這樣,要麼使用某種分組來獲取字符串末尾的發佈日期到一個單獨的變量?

希望這有助於:)

+0

這不是可疑的。 –

+0

你開始提出問題的時候,告訴我們線路可以有多種格式,然後給我們舉兩個例子。我們無法在這些條件下工作! –

+0

它爲什麼可疑?我在帖子中描述了不同的格式。我想刪除所有引用/ parantheses /#,以及包含在()或{}中的所有內容,並可能將最後一位數字提取爲單獨的字符串。你需要更多信息?抱歉不清楚。 – Katie

回答

1

的正則表達式應該是

$regexp = '[\W]*([\w- üæöä]+)[\W^-].*([\d?]{4})'; 
+0

「某些標題包含在qoutes中,有些以#或$」「開頭,其中大部分以發佈年底結尾(否則爲????)。」你應該閱讀這個問題,marc。 –

+0

這就是第一段所說的內容,但問題的其他部分告訴我這個正則表達式會起作用。如果他沒有進一步指定他的問題,這個答案是有效的。 – marc

+0

凱蒂是一個女孩的名字,如果你想有選擇地忽略問題的一部分,使你的答案更容易,那是你的選擇,但我不認爲這對OP有用。 –

-2

試試這個:

$data = '"Ein Engel für alle" (2005) {Katzenjammer (#2.5)}   ????'; 
$year; 
$title; 

if (preg_match('#(\d{4})$#', $data, $matches)) 
{ 
    $year = $matches[1]; 
} 
if (preg_match('#^(?:"(.*)")|(.*)\s+\(\d{4}\)#', $data, $matches)) 
{ 
    $title = ($matches[2] ? $matches[2] : $matches[1]); 
} 

編輯我的回答,以滿足您的需求。 ;)

+0

與marc相同的評論。 –

+0

現在_only_僅提取發佈日期,並且僅當標題中沒有四位數字時。 –

+0

這就是她想要的。她希望日期在字符串的末尾。也增加了標題。 –

1

你可以使用這個腳本:

<?php 
$inputs = Array(
     '"Ein Engel für alle" (2005) {Katzenjammer (#2.5)} ????', 
     '#"Sospecha" (1963) {El caso del viejo del Tibet}  1963', 
     'MTV Europe Music Awards 1998 (1998) (TV)  1998', 
     '"Hotel Cæsar" (1998) {(#12.26)}    1998', 
     '$Am Rande - Sechs Kapitel über AIDS in der Ukraine (2006) 2006' 
); 

foreach ($inputs as $input) { 
     $matches = Array(); 
     if (!preg_match('/^(?:\$|#)?(?:"(.+?)"|(.+?)) \(\d{4}\) .* (\d{4}|\?{4})$/', $input, $matches)) 
       continue; 

     print $matches[1] . $matches[2] . ", " . $matches[3] . "\n"; 
} 
?> 

Output

Ein Engel für alle, ???? 
Sospecha, 1963 
MTV Europe Music Awards 1998, 1998 
Hotel Cæsar, 1998 
Am Rande - Sechs Kapitel über AIDS in der Ukraine, 2006 

這應該正是準確地滿足您的給定的規則(儘管它不使用你提出的方法步驟,其中做不適合模式匹配解決方案)。

讓我們在那個正則表達式仔細一看:

​​
+0

沒關係,我知道你不能按照我描述的順序去做,它更像是對你的簡單描述。馬克已經給了我答案,但是感謝你對正則表達式的洞察力,真正的信息! – Katie

+0

@凱蒂:沒問題;樂於幫助。 –

-1
$string = '"Ein Engel für alle" (2005) {Katzenjammer (#2.5)} ???? 
"Sospecha" (1963) {El caso del viejo del Tibet}  1963 
MTV Europe Music Awards 1998 (1998) (TV)  1998 
"Hotel Cæsar" (1998) {(#12.26)}    1998 
Am Rande - Sechs Kapitel über AIDS in der Ukraine (2006) 2006'; 

preg_match_all('#(.*?) \(([0-9]+)\)#i', $string, $matches); 
$count = count($matches[0]); 

for($i = 0; $i < $count; $i++){ 
    $title = preg_replace('#["\#\$]#us', '', $matches[1][$i]); 
    echo "$title, {$matches[2][$i]}"."<br />"; 
} 

結果:

Ein Engel für alle , 2005 
Sospecha , 1963 
MTV Europe Music Awards 1998 , 1998 
Hotel Cæsar , 1998 
Am Rande - Sechs Kapitel über AIDS in der Ukraine , 2006 
+0

[這是爲提供的_actual_輸入而破壞的](http://www.ideone.com/BUUNR)。 –

+0

服務器測試之前,你downvote ... http://www.cazorlanet.com/so.php –

+0

我做到了。我的評論是一個鏈接,表明破碎。 –