Выбрать все слова, которых нет в списке

Тема в разделе "Регулярные выражения", создана пользователем Matinier, 24 июл 2013.

Модераторы: xpert13
  1. Matinier

    Matinier Постоялец

    Регистр.:
    5 окт 2009
    Сообщения:
    65
    Симпатии:
    4
    Добрый день.
    Имеется набор строк такого типа: Карта памяти microSD 2GB GoodRam + SD адаптер
    Необходимо из нее вытащить вендора, т.е. GoodRam.
    Вытаскивал такой вот регуляркой:

    Код:
    ~(?:^|\s+)([a-z&-]{3,})\s+~iu
    Однако она вытаскивает и microSD. По этому поводу возник вопрос: как можно выбрать все слова [a-z]{3,}, за исключением заранее заданного списка слов вроде microSD, HDMI и т.п.
     
  2. zek24

    zek24

    Moderator
    Регистр.:
    14 ноя 2009
    Сообщения:
    776
    Симпатии:
    230
    1) заменой на пустое место в обычном текстовом редакторе
    2) php заменой текста
     
  3. Matinier

    Matinier Постоялец

    Регистр.:
    5 окт 2009
    Сообщения:
    65
    Симпатии:
    4
    Это надо делать программно в процессе обработки немаленького xls-файла.
    То есть предварительно открыть его и позаменять все совпадения не получится.
     
  4. Compressor

    Compressor

    Регистр.:
    31 янв 2009
    Сообщения:
    314
    Симпатии:
    200
    Так?

    PHP:
    $stopwords = array("microSD""HDMI");
    $str "microSD 2GB GoodRam + SD адаптер";
    $str str_replace($stopwords""$str);
    preg_match("~(?:^|\s+)([a-z&-]{3,})\s+~iu"$str$matches);
     
    echo 
    $matches[1];
     
  5. etosh

    etosh Создатель

    Регистр.:
    22 июл 2013
    Сообщения:
    32
    Симпатии:
    4
    С такой регуляркой выпадут все бренды типа HP, WD и 3Q. С другой стороны, будут траблы с такими вариантами, как Hewlett Packard и Western Digital. Может быть, чем список стоп-слов делать, лучше пройтись по вариантам брендов, и их потом искать в строке? Судя по области из примера, брендов будет не так уж много.
     
  6. dwarf

    dwarf Постоялец

    Регистр.:
    12 июн 2011
    Сообщения:
    88
    Симпатии:
    18
    А если использовать sed для замены стоп слов на пустые в начале, а потом уже обработать регуляркой?