получение подстроки из строки с помощью регулярного выражения

234
28 апреля 2017, 20:56

есть строка, например: _это_та_самая_строка.окончание

с помощью какого регулярного выражения можно получить именно слово "строка?"

вариант '/\_(.+?)\./' возвращает "это_та_самая_строка"

$text = '_это_та_самая_строка.окончание';
$pattern = '/\_(.+?)\./';
preg_match_all($pattern, $text, $matches);
echo '<pre>';
print_r( $matches );
echo '</pre>';

результат

Array
(
    [0] => Array
        (
            [0] => _это_та_самая_строка.
        )
    [1] => Array
        (
            [0] => это_та_самая_строка
        )
)
Answer 1
$text = '_это_та_самая_строка.окончание';
$pattern = '~.*_([а-я]+)\.~iu';
preg_match($pattern, $text, $matches);
echo $matches[1];// строка
Answer 2

Ваше регулярное выражение находит _ после которого в группу №1 захватываются любые символы, 1 и более раз, как можно меньше (т.к. +? - "ленивый" квантификатор, заставляющий движок тестировать на совпадение последующие шаблоны и возваращаться к квантифицируемому только в случае неудачи), до самого первого вхождения символа .. То есть .+? "проглатывает" все символы _ по пути к первой точке.

Здесь несколько решений. Эдуард предлагает захватывать только 1 и более руссих букв после последнего _ и до первой точки. Если нет уверенности, что в этом месте в строке будут только русские буквы, воспользуйтесь исключающим символьным классом.

/_([^_.]+)\./
  ^^^^^^^^

Подробности:

  • _ - символ _
  • ([^_.]+) - 1 и более символов, отличных от _ и .
  • \. - точка.

PHP-демо:

$text = '_это_та_самая_строка.окончание';
preg_match_all('/_([^_.]+)\./u', $text, $matches);
print_r( $matches[1] ); // Только содержимое первой захватывающей группы

Если (у некоторых возникает такое) есть желание получить массив только с желаемым результатом (т.е. избавиться от захватывающей группы), можно использовать

preg_match_all('/_\K[^_.]+(?=\.)/u', $text, $matches);
print_r( $matches[0] );

Тут \K удалит из текущего совпадения весь найденный до текущего момента текст, а (?=\.), блок предварительного просмотра вперёд, проверит, есть ли после 1+ символов, отличных от . и _, точка и вернёт совпадение только если точка будет найдена.

READ ALSO
Генератор случайных чисел с энтропией

Генератор случайных чисел с энтропией

Необходимо сгенерировать случайные числа в диапазоне от 0 до 100 с шагом 1 (или 01 с шагом 0

336
Thread или таймер

Thread или таймер

Каждые 6 секунд получаю данные с АЦП через COMPORTКак по-вашему лучше (правильнее) оформить: через поток или через компонент Timer прямо в основной...

261
Как сохранить бинарные данные в json?

Как сохранить бинарные данные в json?

Здравствуйте! Возник такой вопрос: как сохранить бинарный файл (png) в памяти в поле Json::value (библиотека jsoncpp)? Мне это нужно для того, чтоб потом...

284