Вырезать только нужный текст

183
13 марта 2018, 03:54

Есть строка Покупка паетов: Ntv_56°E, Xtra TV 4W на сумму 0.066667 $

Как получить только Ntv_56°E, Xtra TV 4W , учитывая что строка может быть и такой: Покупка паетов: Ntv_56°E на сумму 0.066667 $

Буду благодарен за помощь.

Answer 1

Нужно искать символ :, за которым следует пробел, и далее - любая последовательность любых символов, отличных от русских букв. Для этой задачи я составил шаблон (?<=:\s)[^а-я]+(?=\s), и теперь опишу его составляющие.

С помощью позитивной ретроспективной проверки (?<= ) выполняется поиск позиции, слева от которой находится символ :, за которым следует пробел (обозначены стрелками ^):

(?<=:\s)
    ^^^

С помощью символьного класса [ ] и метасимвола ^ (который внутри символьного класса обозначает отрицание) выполняется поиск символов, которые не совпадают с диапазоном символов от а до я включительно. Иначе говоря, совпадения будут найдены для любых символов, кроме букв русского алфавита. Квантификатор + указывает на поиск одного или более таких символов. Иначе говоря, поиск будет успешным, если будет найден хотя бы один символ из перечисленных в символьном классе:

[^а-я]+
  ^^^

С помощью позитивной опережающей проверки (?= ) выполняется поиск позиции, справа от которой находится пробел:

(?=\s)
   ^^

Следует помнить, что опережающие проверки ищут позиции в строке, а не соответствие символам, и поэтому результат их успешного поиска не будет "виден" в найденной подстроке. Если говорить конкретно об этом шаблоне (?<=:\s)[^а-я]+(?=\s), то символ : и следующий сразу за ним пробел, а так же пробел, который следует после найденного совпадения с символьным классом, не будут включены в найденную подстроку.

$str = 'Покупка паетов: Ntv_56°E, Xtra TV 4W на сумму 0.066667 $';
$patt = '~(?<=:\s)[^а-я]+(?=\s)~u';
preg_match($patt, $str, $arr);
var_dump($arr);

Результат:

array (size=1)
  0 => string 'Ntv_56°E, Xtra TV 4W' (length=22)

Для строки Покупка паетов: Ntv_56°E на сумму 0.066667 $ результат будет таким:

array (size=1)
  0 => string 'Ntv_56°E' (length=10)
READ ALSO
Как создать такой массив программно?

Как создать такой массив программно?

Как создать такой массив программно (php)?

190
Ошибка unauthorized_client при попытке подключиться к API google spreadsheets

Ошибка unauthorized_client при попытке подключиться к API google spreadsheets

Сайт на yii2Пытаюсь подключиться к документу из google spreadsheets и вытянуть оттуда данные, но при первой же попытке подключиться к файлу вижу ошибку

190
Фильтрация значений инпутов

Фильтрация значений инпутов

Видел, как таким способом фильтруют значения инпутовРешил попробывать

215