Мне нужно сопоставить все строки, как /(\:\w+)/
(например. :hello
), за исключением случаев, когда перед первым символом экранируется обратная косая черта, например: \:hello
, Так что, в этом случае, не будет совпадать. Но, если я дважды избежу этого, я могу игнорировать обратную косую черту предложения и будет работать нормально, например: \\:hello
получит :hello
только. И так далее.
Примеры:
test :hello test
будет соответствовать :hello
test \:hello test
не будет соответствоватьtest \\:hello test
будет соответствовать :hello
test \\\:hello test
не будет соответствоватьtest \\\\:hello test
будет соответствовать :hello
test \\\\\:hello test
не будет соответствоватьtest \\\\\\:hello test
будет соответствовать :hello
Вы можете попробовать следующее регулярное выражение, которое использует \K
(отбрасывает ранее подобранные символы).
(?:\s|^)(?:\\\\)*\K:\w+
Ну вот:
$regex = '/(?<=^|[^\\\\])(?:[\\\\]{2})*(?P<tag>:\w+)/';
И некоторые тесты:
$tests = array(
'test :hello test',
'test \\:hello test',
'test \\\\:hello test',
'test \\\\\\:hello test',
'test \\\\\\\\:hello test',
'test \\\\\\\\\\:hello test',
'test \\\\\\\\\\\\:hello test',
);
echo '<pre>';
foreach ($tests as $test) {
preg_match($regex, $test, $match);
if (empty($match)) {
echo 'NOPE: ', $test, "\n";
} else {
echo 'MATCH: ', $test, ' - ', $match['tag'], "\n";
}
}
Это дает мне:
MATCH: test :hello test - :hello
NOPE: test \:hello test
MATCH: test \\:hello test - :hello
NOPE: test \\\:hello test
MATCH: test \\\\:hello test - :hello
NOPE: test \\\\\:hello test
MATCH: test \\\\\\:hello test - :hello
Ты пробовал как этот: —
(?!<=)(:hello)
Как насчет
если происходит в начале строки
^(?:\\\\)*(:hello)
где-нибудь еще
\s(?:\\\\)*(:hello)\b
обратная ссылка \1
будет содержать :hello
посмотрите пример