2011-07-17 78 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

我做到了。我的评论是一个链接,表明破碎。 –