Заменить кавычки и слова в скобках на preg_match? - PullRequest
1 голос
/ 17 июля 2011

Я изо всех сил пытаюсь подобрать несколько названий фильмов в странном формате. Некоторые из заголовков заключены в кавычки, а некоторые начинаются с # или $, и большинство из них заканчивается в конце года выпуска (иначе ????).

Я пытаюсь заменить это:

"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. Или оставьте это так, или используйте какую-то группировку, чтобы получить дату выпуска в конце строки в отдельной переменной?

Надеюсь, это поможет:)

Ответы [ 4 ]

1 голос
/ 17 июля 2011

Вы можете использовать этот скрипт:

<?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
1 голос
/ 17 июля 2011

регулярное выражение должно быть

$regexp = '[\W]*([\w- üæöä]+)[\W^-].*([\d?]{4})';
0 голосов
/ 17 июля 2011
$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 голосов
/ 17 июля 2011

Попробуйте это:

$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]);
}

Отредактировал мой ответ в соответствии с вашими потребностями. ;)

...