Как сделать что-то типа - ИЩИ СТРОГО ЭТО

Тема в разделе "Регулярные выражения", создана пользователем Solomon Kane, 1 мар 2011.

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

    Solomon Kane Постоялец

    Регистр.:
    26 авг 2009
    Сообщения:
    144
    Симпатии:
    9
    Проблема такая, есть, допустим, следующая строка:

    - Хорошо, - сказал я.

    Если в регулярке задать просто [А-Я], то есть чтобы первый символ был строго буква от А до Я, а дальше указать ряд других условий, которые не важны в данном вопросе, то вся строка посчитается, как вхождение, кроме тире. То есть получится Хорошо, - сказал я. НО надо сделать так, чтобы при встрече - перед большой буквой, вся последующая строка игнорировалась. Проблема в том, что нельзя задать начало строки, так как она может быть гигантской. Или просто большой. Например, такой:

    - Хорошо, - сказал я. Затем взял чемодан и пошёл на улицу. Там поймал такси и уехал.

    Так вот в этой строке "- Хорошо, - сказал я." должно полностью проигнорироваться. В массив должны попасть только следующие две строки. Они-то на самом деле и так попадают, но попадёт и прямая речь, а её надо удалять.

    Плюс ещё такой момент - как правильно задать троеточие?
    Вариант типа [^{какие-то условия}] не подходит. Сильно много учитывать придётся. Как это лучше сделать? Неужели, нет конструкции типа ИЩИ СТРОГО ЭТО, то есть совпадение должно начинаться с [А-Я] и перед ними ничего не должно быть.

    Ещё такой момент - как правильно задать троеточие?
     
  2. VandJ

    VandJ

    Регистр.:
    8 апр 2008
    Сообщения:
    319
    Симпатии:
    115
    Можно сразу удалить то, что тебе ненужно, а потом (если надо) сохранить в массив…
    Примерно так:
    PHP:
    <?
    $text "- Хорошо, - сказал я. Затем взял чемодан и пошёл на улицу!!! Там поймал такси и уехал. - Долго, - ехал я??  - Хорошо, - сказал я!!!";
    $text preg_replace("'(?:-\s[А-Я].*?[\.|\?|\!]{1,3}\s[А-Я])[\b]|(?:-\s[А-Я].*?[\.|\?|\!]{1,3})'"""$text);
    //echo $text; //Затем взял чемодан и пошёл на улицу. Там поймал такси и уехал.
    preg_match_all("'([А-Я].*?[\.|\?|\!]{1,3})'",$text,$text);
    print_r ($text);
    ?>
    троеточие так
    Код:
    \.\.\.
    или так
    Код:
    \.{3}
     
    Solomon Kane нравится это.
  3. Solomon Kane

    Solomon Kane Постоялец

    Регистр.:
    26 авг 2009
    Сообщения:
    144
    Симпатии:
    9
    А без предварительного удаления никак? Предварительное и я сам сделал с помощью штатной функции str_replace(). Но там получается, что надо изначальный массив с содержимым как-то раскладывать и так далее. А хотелось бы, чтобы сразу открыть файл как строку и вытянуть, что надо. Слышал, про какие-то конструкции взад-вперёд, но пока не смог с ними разобраться. Может, можно как-то для найденного совпадения продвинутся назад и, если там что-то типа - Я, - сказал - игнорировать совпадение?
     
  4. VandJ

    VandJ

    Регистр.:
    8 апр 2008
    Сообщения:
    319
    Симпатии:
    115
    PHP:
    preg_match_all("'(?<=(?<!-)\s)([А-Я].*?[\.|\?|\!]{1,3})'",$text,$matches);
     
    Solomon Kane нравится это.
Статус темы:
Закрыта.