Убрать из title не нужные части

Тема в разделе "Регулярные выражения", создана пользователем Dador, 11 май 2009.

Статус темы:
Закрыта.
Модераторы: xpert13
  1. Dador

    Dador Читатель

    Заблокирован
    Регистр.:
    14 янв 2008
    Сообщения:
    368
    Симпатии:
    97
    Выдираю title из html вот так:
    Код:
    	preg_match('%<title.*?>(.*?)</title.*?>%sim', $text, $result);
    (php) сам в RegExp - фигово, так вот, как сделать так чтобы если вот такое название:
    Код:
    Новости@Mail.Ru: Последствия взрыва газопровода в&nbsp;Москве
    бралось только
    Код:
    Последствия взрыва газопровода в&nbsp;Москве
    или при
    Код:
    Поддержка модулей расширения в DLE 7 и 8 &raquo; Всё для DLE, Datalife Engine, ДЛЕ. Модули, шаблоны, скины, хаки. PHP скрипты.
    бралось только
    Код:
    Поддержка модулей расширения в DLE 7 и 8
    или при
    Код:
    Название статьи - NameSite.com
    - бралось только
    Код:
    Название статьи
    Желательно универсально... можно и заменять их preg_replace, мне без разницы, но как получить само название, с учетом что может быть любое из этих вариантов, или может быть так что его вовсе не будет
     
  2. Folly

    Folly Создатель

    Регистр.:
    7 май 2009
    Сообщения:
    15
    Симпатии:
    2
    Только данные 3 случая или еще какие-то могут быть?
     
  3. Dador

    Dador Читатель

    Заблокирован
    Регистр.:
    14 янв 2008
    Сообщения:
    368
    Симпатии:
    97
    вообще данные 3, но с любым тестом т.е. под
    Код:
    Новости@Mail.Ru: Последствия взрыва газопровода в&nbsp;Москве
    должно подходить и
    Код:
    MySite.com: Новые обои в разделе Графика
     
  4. Liver

    Liver

    Регистр.:
    24 сен 2008
    Сообщения:
    316
    Симпатии:
    91
    в твоем случае проще всего забить массив таких фраз как
    Новости@Mail.Ru:
    - NameSite.com
    &raquo; Всё для DLE, Datalife Engine, ДЛЕ. Модули, шаблоны, скины, хаки. PHP скрипты.

    и вырезать все это из титла простым str_replace в цикле. К остатку trim и все довольны.

    А если система самообучается, то есть выбирает, допустим список титлов и новостей, то можно тут же после выборки найти общую часть (правда реализация такого не очень простая) и в конце пробежатся по титлам и вырезать эту общую часть.
     
  5. Dador

    Dador Читатель

    Заблокирован
    Регистр.:
    14 янв 2008
    Сообщения:
    368
    Симпатии:
    97
    нет простым стр_репалс, не пойдет, я знаю такой способ, дело в том что таких сайтов будет тысячи, и ручками со всех собрать никогда не получится, тут надо что то вроде preg_replace('Это удалить:любые символы', '$1', $text); где любые символы - это сам тайтл, а "Это удалить:" это удаляется путем замены всей фразы на аргумент $1 ("любые символы") вот как только под "Это удалить:", да "&raquo; это удалить", и "- это удалить" сделать регулярное выражение? т.е. чтобы подходило под любую фразу такого вида

    (надеюсь объяснил понятно)
     
  6. Liver

    Liver

    Регистр.:
    24 сен 2008
    Сообщения:
    316
    Симпатии:
    91
    Такого регулярного выражения, чтобы подходил везде-везде написать невозможно.
    Я вот писал парсилку дле-сайтов и там использововал именно самообучение, где парсю страницу и с нее новости выдираю полный текст и потом в конце имею 10ок титлов, выделяю из нее общую часть и чищу от нее. без всяких регулярок.
     
  7. асс

    асс

    Регистр.:
    13 окт 2006
    Сообщения:
    749
    Симпатии:
    220
    а может можно просто сделать так
    [\w]
    [a-zA-ZА-Яа-я-0-9]
    по идее только буквы заберете.
    брать через preg_match

    В общем я чищу мусор для добавления ссылки чпу так
    HTML:
     $cpu=  preg_replace("[\W]",'_',$cpu);     
    в место - оставить " " и все мусора не должно быть, его вырежет


    старый вариант когда-то был у меня такой
    HTML:
    $te = array("'", "-", "+", "$", "@", "!","&nbsp;","№","#","%","^","'" ,'"' ,"," ,"-" ,"_" ,":","=", "." ,"/"  ,"\\" ,")" ,"("
      ,"|","*","<",">" ,",","?","~","&quot;","&8211;","»","«");
    $cpu=str_replace($te, "", $cpu);
    
     
  8. RolCom

    RolCom

    Регистр.:
    12 мар 2008
    Сообщения:
    351
    Симпатии:
    108
    Код:
    <title[^>]*>(?:[^<:]*:)?(?:([^<]*)(?:-|&raquo;)|([^<]*))
    
    Добавлено через 20 минут
    Невнимательно прочел, выбрать все до &raquo;, поправил.
     
    Dador нравится это.
  9. Dador

    Dador Читатель

    Заблокирован
    Регистр.:
    14 янв 2008
    Сообщения:
    368
    Симпатии:
    97
    Вот такая фигня Warning: preg_match() [function.preg-match]: Unknown modifier ']' in путь on line 3
    ну на 3 строке естественно функция с регуляркой, пробую так:
    Код:
    preg_match('<title[^>]*>(?:[^<]*(?:&raquo;|:))?(?|([^<]*)-|([^<]*))', '<title>Lols xD</title>', $result);
     
  10. RolCom

    RolCom

    Регистр.:
    12 мар 2008
    Сообщения:
    351
    Симпатии:
    108
    ПХПшные символы-ограничители поставить.
    Код:
    preg_match('%<title[^>]*>(?:[^<]*(?:&raquo;|:))?(?|([^<]*)-|([^<]*))%i'
    
     
    Dador нравится это.
Статус темы:
Закрыта.