Это трудно сделать, если вы ищете квадратные скобки (как вы выяснили).Если вы не пытаетесь сопоставить их и просто ищете названия карт, где бы они ни встречались, тогда это просто:
\b([AKQJakqj1-9]0?[DHSCdhsc])\b
Маркеры \b
проверяют границы слов.Они гарантируют, что имя карты должно быть отдельным словом, поэтому, например, Ah
в Ahead
не будет совпадать.
Обработка квадратных скобок довольно сложная.В идеале вы могли бы использовать утверждения типа lookahead и lookbehind , чтобы проверить их, но есть неблагоприятное ограничение для утверждений lookbehind, которое делает их непригодными для работы:
Содержимое утверждения позадиограничены таким образом, что все строки, с которыми оно совпадает, должны иметь фиксированную длину.
Поэтому вместо этого я пришел к решению двойной замены, использующему флаг /e
, чтобы вложить один вызов preg_replace
внутридругой.
preg_replace(
'/\[(.*?)]/e',
"preg_replace('/(\b[AKQJT1-9]0?[DHSC]\b)/i', '\\\$1.jpg', '$1')",
$hh
);
Внешнее регулярное выражение ищет квадратные скобки и фиксирует внутренности.Внутреннее регулярное выражение ищет имена карт внутри этого $1
и превращает их в изображения.
Кстати, я добавил T
к вашему шаблону, поскольку 10 ♦ обычно записывается как Td
в истории руки я добавил флаг i
, чтобы сделать поиск нечувствительным к регистру.