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

Статус
В этой теме нельзя размещать новые ответы.

Solomon Kane

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

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

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

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

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

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

Ещё такой момент - как правильно задать троеточие?
 
Можно сразу удалить то, что тебе ненужно, а потом (если надо) сохранить в массив…
Примерно так:
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}
 
А без предварительного удаления никак? Предварительное и я сам сделал с помощью штатной функции str_replace(). Но там получается, что надо изначальный массив с содержимым как-то раскладывать и так далее. А хотелось бы, чтобы сразу открыть файл как строку и вытянуть, что надо. Слышал, про какие-то конструкции взад-вперёд, но пока не смог с ними разобраться. Может, можно как-то для найденного совпадения продвинутся назад и, если там что-то типа - Я, - сказал - игнорировать совпадение?
 
Слышал, про какие-то конструкции взад-вперёд, но пока не смог с ними разобраться. Может, можно как-то для найденного совпадения продвинутся назад и, если там что-то типа - Я, - сказал - игнорировать совпадение?
PHP:
preg_match_all("'(?<=(?<!-)\s)([А-Я].*?[\.|\?|\!]{1,3})'",$text,$matches);
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху