Есть телепрограмма, в которой строки вида
0.00 Название фильма (художественный фильм).
необходимо заменить на
0.00 Х/ф "Название фильма".
Сложность в том, что между "Название фильма" и открывающей скобкой может быть один или несколько пробелов, табуляция либо ничего.
$txt = <<<TXT
0.00 Маска (художественный фильм).
1.30 Новости.
2.00 Хит-парад (итоги).
2.10 Профилактика.
9.10 Квартира(художественный фильм).
10.50 Новости.
11.20 Концерт группы "Чай вдвоем" (повтор).
13.00 Оружие Второй мировой(документальный фильм).
13.30 За спичками (художественный фильм).
TXT;
print_r(preg_replace('#(\d[.]\d{2}) ([^(\r\n]+)[\w]*[(]художественный фильм[)][.]#', '\1 Х/ф "\2".', $txt));
Этот код выводит следующее
Т.е. регулярка "захватывает" (в \2) пробелы перед открывающей скобкой (...
[\w]*[(]художественный фильм[)][.]), а нужно, чтобы пробелы и табуляции игнорировались.
У меня ступор, выручайте.
Спустя 34 минуты, 39 секунд (17.05.2012 - 10:27) Invis1ble написал(а):
preg_replace('#(\pN{1,2}\.\pN{2}) (.+?)\pZ*+\(художественный фильм\)\.#u', '$1 Х/ф "$2".', $txt)
Спустя 27 минут, 5 секунд (17.05.2012 - 10:54) Placido написал(а):
Спасибо! А что это за символьные классы - \pN и \pZ? Первый раз их встречаю.
Спустя 1 минута, 53 секунды (17.05.2012 - 10:56) Invis1ble написал(а):
\pN - цифры, \pZ - пробельные символы. В случае юникода рекомендуется применять именно их во избежание глюков. Аналоги - \d и \s
Спустя 1 минута, 27 секунд (17.05.2012 - 10:58) Placido написал(а):
Спустя 16 секунд (17.05.2012 - 10:58) Invis1ble написал(а):