我很难以一种奇怪的格式匹配我的几部电影。有些标题用引号括起来,有些标题以#
或$
开头,大部分以结尾的发行年结束(否则为????)。
我正在尝试替换它:
"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
......如果可能的话,以某种方式获得发行年份。在示例中,我只是放了一个逗号,但是如果你不能得到发布日期就离开它,我会以另一种方式得到它。
我是正则表达式的完全新手,但我还是试着没有运气。如果有人能帮我一把,我真的很感激!
修改
为了减少混乱:
删除()
或{}
中包含的所有内容。
删除字符串开头的$
或#
。
如果标题用引号括起来,请将其删除。
要么保留这样,要么使用某种分组将字符串末尾的发布日期变为单独的变量?
希望这会有所帮助:)
答案 0 :(得分:1)
正则表达式应为
$regexp = '[\W]*([\w- üæöä]+)[\W^-].*([\d?]{4})';
答案 1 :(得分: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";
}
?>
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
这应该准确而准确地符合您给定的规则(尽管它不使用您提出的方法步骤,这些步骤并不真正适合模式匹配解决方案)。
让我们仔细看看那个正则表达式:
/ # start of regex
^ # starting delimiter and start-of-input
(?:\$|#)? # $ or # (but don't capture)
(?: # (don't capture the outer group)
"(.+?)"|(.+?) # title either in quotes or not
)
#\(\d{4}\) # the inner date (delimits the title when the title has no quotes)
.* # any other inner fluff
(\d{4}|\?{4}) # either four digits, or four question marks
$ # the end-of-input must immediately follow
/ # end of regex
答案 2 :(得分:-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
答案 3 :(得分:-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]);
}
编辑我的答案以满足您的需求。 ;)