Регулярное выражение с прописными словами и тире

Заданные текстовые строки, такие как эти:

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])

Regex онлайн демо

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 '-]*(?= |$)

Онлайн демо обновленной версии

Другие вопросы по тегам