Помогите с регулярным выражением php

207
28 января 2020, 09:10

Доброй ночи, имею выражение

$string='ГОСТ Р ИСО /МЭК 7498-1-99. Информационная технология. Взаимосвязь 
открытых систем. Базовая эталонная модель. Часть 1. Базовая модель (принят и 
введен в действие Постановлением Госстандарта России от 18.03.1999 № 78)';
preg_match_all("~ГОСТ\s*Р\s*\w+(\W|\W+)\w+\W\d+\W\d+\W\d+~iu",$string,$matches);
var_dump($matches);

Получаю ответ:

array(2) { [0]=> array(1) { [0]=> string(36) "ГОСТ Р ИСО /МЭК 7498-1-99" } [1]=> array(1) { [0]=> string(2) " /" } }

Помогите понять, откуда берётся второй элемент массива " /". Или подскажите как сделать так, чтобы он находил подстроки ГОСТ Р ИСО /МЭК 7498-1-99 и ГОСТ Р ИСО/МЭК 7498-1-99

Answer 1

Шаблон (\W|\W+) является захватывающей подмаской, значение которой при совпадении сохраняется в отдельном буфере (поэтому и присутствует в результате), и означает следующее:

  • Проверяет текущий символ, который должен быть отличным от буквы, цифры и знака подчёркивания
  • Если находит соответствие, сохраняет его в первой захватывающий подмаске и переходит к проверке следующих шаблонов в выражении
  • Если соответствия нет, пытается "захватить" 1 и более символов, которые должны быть отличными от буквы, цифры и знака подчёркивания.

В общем случае, чтобы сделать подмаску незахватываемой, можно добавить ?: после (: (?:шаблон1|шаблон2).

В данном случае, чередование и подмаску можно опустить и использовать только \W+.

'~ГОСТ\s*Р\s*\w+\W+\w+\W\d+\W\d+\W\d+~ui'

См. демо регулярного выражения.

Возможно, имеет смысл добавить + (1 и более повторов) после каждого \W:

'~ГОСТ\s*Р\s*\w+\W+\w+\W+\d+\W+\d+\W+\d+~ui'
Answer 2

Второй элемент берется в этой строчке: (\W|\W+), т.к. они взяты в скобки. Чтобы их игнорировать, нам достаточно написать ?:

preg_match_all("~ГОСТ\s*Р\s*\w+(?:\W|\W+)\w+\W\d+\W\d+\W\d+~iu",$string,$matches);
READ ALSO
Очень странное поведение Laravel

Очень странное поведение Laravel

Доброй ночиИмею два отдельных проекта api и веб-интерфейс на Laravel

224
Как вывести подсчет суммы по количеству выбранного товара на странице каталога Woocommerce

Как вывести подсчет суммы по количеству выбранного товара на странице каталога Woocommerce

Я использую плагин WooCommerce Product Price x Quantity PreviewДанный плагин подсчитывает сумму по количеству выбранного товара, но он это делает только в карточке...

244
Посмотреть, что делает процесс PHP

Посмотреть, что делает процесс PHP

Есть несколько PHP-cgi процессов, как посмотреть что они делают (хотя бы один) в данный момент? Например, какой файл выполняетИли GET-запрос

238
Как открыть или запустить файл с расширением .maple локально с помощью javascript, php?

Как открыть или запустить файл с расширением .maple локально с помощью javascript, php?

Подскажите пожалуйста, возможно ли открыть или запустить файл с расширениемmaple из web формы с помощью js или php? если нет,то с помощью чего? мне...

214