Вопрос по регам

Black Fox

Новичок
Вопрос по регам

У меня второй день изучения регулярных выражений.
Нужно вырезать со страницы заголовок.
Я написал следующее выражение, но оно не работает:
preg_match("~(?<=<(?:title|TITLE)>)(?=\/<(?:title|TITLE)>)~", $content, $matches);

помогите пожалуста
 

su1d

Старожил PHPClubа
может быть как-то так:
Код:
/<title[^>]*>(([^<]|<(?!\/title))*)<\/title>/msi
?
 

su1d

Старожил PHPClubа
вообще-то, учитывая, что <TITLE> -- это простейший тэг без "примесей", рег можно было написать ещё короче:
Код:
/<title>([^<]*)<\/title>/msi
но т.к. мы рассматриваем более общий случай, то у тэга могут быть атрибуты, а внутри его значения могут быть другие тэги.
 

Black Fox

Новичок
все понял. спасибо

-~{}~ 10.05.04 17:59:

только все таки в чем ошибка у меня?
 

su1d

Старожил PHPClubа
а) ты не получаешь результат, т.к. в твоём преге -- два back reference'а, которые не возвращаются. между ними нужно вставить что-нибудь типа (.*)

б) пробелы после > -- критичны: если их не будет в документе, результата не получишь

в) твой прег не схватит <TiTlE> и подобные

г) если испольуешь тильду (~) как ограничитель тэга, то по-моему уже не обязательно экранировать слэшами наклонную черту (/)

если попробовать переписать правильно твою версию, то наверное будет что-то типа:
Код:
~(?<=<(?:title|TITLE)>)(.+)(?=</(?:title|TITLE)>)~
-~{}~ 10.05.04 16:17:

насчёт пробелов претензия снимается. по ходу это форум автоматически добавляет, если не ометить "Отключить смайлики в этом сообщении".
 

Black Fox

Новичок
пробелов то на самом деле и не было - не знаю как они появились при копировании. Я подозревал что надо чтото вроде (.+), но не сделал. В любом случае спасибо за разъяснение
 
Сверху