У меня есть 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 )