Доброй ночи, имею выражение
$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
Шаблон (\W|\W+) является захватывающей подмаской, значение которой при совпадении сохраняется в отдельном буфере (поэтому и присутствует в результате), и означает следующее:
В общем случае, чтобы сделать подмаску незахватываемой, можно добавить ?: после (: (?:шаблон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'
Второй элемент берется в этой строчке: (\W|\W+), т.к. они взяты в скобки. Чтобы их игнорировать, нам достаточно написать ?:
preg_match_all("~ГОСТ\s*Р\s*\w+(?:\W|\W+)\w+\W\d+\W\d+\W\d+~iu",$string,$matches);
Продвижение своими сайтами как стратегия роста и независимости