Регулярное выражение с прописными словами и тире
Заданные текстовые строки, такие как эти:
wikiradio 27/09/2012 - LE QUATTRO GIORNATE DI NAPOLI raccontate da Ida Gribaudi
wikiradio 04.10.2013 - ДАГ ХАММАРСКДЖОЛД raccontato da Susanna Pesenti
Я работаю над регулярным выражением, чтобы соответствовать только СЛОВАМ ВЕРХНЕЙ строки (т. Е. "LE QUATTRO GIORNATE DI NAPOLI" и "DAG HAMMARSKJOLD"). Мой код такой:
$title = $_GET["title"];
if (preg_match_all('/\\b(?=[A-Z])[A-Z\' ]+(?=\\W)/',$title,$match)) {
process matched portion...
Это работает почти всегда, но когда строка $title включает в себя апостроф + пробел или тире, это не так. Например, заглавные слова в этих двух заголовках не совпадают.
wikiradio 11/02/2014 - L'ABBE 'PIERRE raccontato da Giovanni Anversa
wikiradio 22/12/2015 - ЖАН-МИШЕЛЬ БАСКВИАТ raccontato da Costantino D'Orazio
Что мне не хватает?
1 ответ
Нечто подобное может работать для вас:
\b[A-Z].*?(?= [a-z])
Legenda
\b # regex words boundary [1]
[A-Z] # any single Uppercase letter
.*? # Any char repeatead zero or more in lazy mode
(?= [a-z]) # matches when the next 2 chars are a space and any single lowercase letter
[1] regex word boundary matches between a regex word char '\w' (also [a-zA-Z0-9_])
and a non word \W ([^a-zA-Z0-9_]) or at start/end of the string
(just like '^' and '$')
Демонстрация кода на ideone
Обновить
Обновленная версия, которая работает с использованием белого списка символов (мы не можем знать, что это все возможно)
(?m)\b[A-Z][A-Z '-]*(?= |$)
Онлайн демо обновленной версии