Различия между одинарной и двойной обратной косой чертой - PullRequest
1 голос
/ 14 января 2012

Как я могу проверить, есть ли нечетные или четные косые черты перед персонажем? PHP видит одинарную и двойную обратную косую черту одинаково! Пожалуйста, посмотрите на коды ниже:

$str = "\a\\b\\\c";
echo preg_replace("/\\\/", "+", $str); // +a+b++c
echo preg_replace("/\x{005c}/u", "+", $str); // +a+b++c

echo strlen($str); // 7
for($i=0; $i<strlen($str); $i++)
    echo bin2hex($str{$i}).', ';
// Output: 5c, 61, 5c, 62, 5c, 5c, 63

Я хочу проверить, был ли экранирован символ или нет!


Как проверить различия между этими двумя строками: " \ a ", " \\ a "? как функция date ().

Спасибо

Ответы [ 3 ]

1 голос
/ 14 января 2012

Ваша строка на самом деле \a\b\\c - \a является недопустимой escape-последовательностью, следовательно, она становится \a, попробуйте однако \n, который действителен, чтобы увидеть разницу.

1 голос
/ 21 января 2012

Короткий ответ: вы не можете использовать регулярные выражения.Вы не можете сделать утверждения с изменяемой длиной, необходимые для гарантии этого.Мне удалось написать регулярное выражение, которое очень хорошо справлялось с поиском таких строк, даже оптимизированное с использованием однократных подшаблонов, но оно могло иногда вызывать переполнение буфера и аварийно завершать работу сценария при большом количестве совпадений.

Естьвзгляд на strcspn().Это очень хорошо для написания пользовательских функций разбора.Вы можете использовать \ в качестве символа остановки.Затем со следующим персонажем действуйте на него, если он особенный, или прыгайте вперед, если это не так.Он также работает быстрее, чем регулярные выражения.

1 голос
/ 14 января 2012

\a может совпадать с \\a, но \n определенно не совпадает с \\n. Если обратная косая черта со следующим символом разрешается в специальной последовательности, обратная косая черта действует как escape-символ. В противном случае обратная косая черта - это просто обратная косая черта.

...