У меня есть 2 текста в строке:
% Juan%
% Хуан Гонсалес%
И я хочу только получить% Juan%, а не тот, у кого есть Space, я пытался несколько Regexes без везения. В настоящее время я использую:
/%(.*)%/U
но он получает обе вещи, я пытался добавлять и играть с [^ \ s], но он не работает.
Любая помощь, пожалуйста?
Дело в том, что .
соответствует любому символу, но соответствует новой строке. Режим Un Udgredy только делает .*
Ленив, и он захватывает текст от %
до первого %
справа от первого %
.
Если ваши строки содержат одну пару %...%
, вы можете использовать
/%(\S+)%/
См. Демо-версию regex
Шаблон \S+
соответствует 1 + символам, отличным от пробела, и целому [^\h%]
отрицательному символьному классу, который соответствует любому символу, но горизонтальному пространству и символу %
.
Если у вас несколько пар %...%
, вы можете использовать
/%([^\h%]+)%/
См. Еще одну демонстрацию regex , где \h
соответствует любому горизонтальному пробелу.
Демо-версия PHP :
$re = '/%([^\h%]+)%/'; $str = "%Juan%\n%Juan Gonzalez%"; preg_match_all($re, $str, $matches); print_r($matches[1]);
not the one with the Space
= не [^
+ пространство \s
+ ]
.
Но в нем тоже не может быть %
.
Выполняется как %([^\s%]+)%
Но, для дополнительного кредита, вы можете / должны также соответствовать своему пространству
в нем, чтобы обеспечить сбалансированную настройку разделителя.
(?:%([^\s%]+)%|%[^%]*%(*SKIP)(*FAIL))
Разъяснения
(?: % ( [^\s%]+ ) # (1), Tag you need % | % [^%]* % (*SKIP)(*FAIL) # Consume, but don't match other tags )