Возникли проблемы с группой повторного захвата:
(?:\[)(?:(?:\s*?)([2-9AQTKJ][shcd])+?(?:\s*?)).*?(?:\])
Увидеть демонстрация
В основном я хочу соответствовать значению карты (As
, 8h
и т. д.) комбинации только в квадратных скобках
Любая помощь будет принята с благодарностью.
Спасибо
Вы можете использовать регулярное выражение с \G
оператор для сопоставления нескольких подстрок внутри [...]
:
(?:\[|(?!^)\G)\s*\K[2-9AQTKJ][shcd](?=[^\]]*])
Увидеть regex demo
Короче говоря, это регулярное выражение PCRE будет соответствовать тексту, который:
(?:\[|(?!^)\G)\s*\K
— начинается с [
или в конце предыдущего успешного совпадения, за которым следуют ноль или более пробельных символов[2-9AQTKJ][shcd]
— соответствует 2 символам каждый из определенных наборов(?=[^\]]*])
— положительная проверка, если есть закрытие ]
впереди текущей позиции $re = '~(?:\[|(?!^)\G)\s*\K[2-9AQTKJ][shcd](?=[^\]]*])~';
$str = "[As 4h 8s] [ As 4h ] [As4h] As [ 4h ";
preg_match_all($re, $str, $matches);
print_r($matches[0]);
Вы этого хотите?
/\[([^\]]+)\]/
https://regex101.com/r/vT8aC8/2
РЕДАКТИРОВАТЬ (Полное решение PHP)
$str= "[As 4h 8s] [ As 4h ] [As4h] As [ 4h ";
preg_match_all("/\[([^\]]+)\]/", $str, $matches);
$values = $matches[1];
$result = [];
foreach($values as $value)
{
$parts = preg_split("/ /", $value, -1, PREG_SPLIT_NO_EMPTY);
foreach($parts as $part)
{
array_push($result, $part);
}
}
var_dump($result); // $result will contain all the values you want