Замена части строки продолжает добавлять дополнительную обратную косую черту [дубликат]

Этот запрос должен работать:

$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '%$username%'");
while($row = mysql_fetch_array($result))
{
    echo $row['FirstName'];
}

Проблема заключается в одинарных кавычках, поэтому ваш запрос завершается с ошибкой и возвращает FALSE, и цикл WHILE не может выполняться. Использование% позволяет сопоставлять любые результаты, содержащие вашу строку (например, SomeText- $ username-SomeText).

Это просто ответ на ваш вопрос, вы должны реализовать материал, упомянутый в других сообщениях: обработка ошибок , используйте escape-строки (пользователи могут вводить что-либо в поле, и вы ДОЛЖНЫ убедиться, что это не произвольный код), используйте PDO вместо mysql_connect, который теперь лишен.

9
задан Alan Moore 7 November 2015 в 17:34
поделиться

3 ответа

Путаница объясняется тем, что символ обратной косой черты \ используется как побег на двух разных уровнях. Во-первых, интерпретатор Python сам выполняет подстановки для \, прежде чем модуль re когда-нибудь увидит вашу строку. Например, \n преобразуется в символ новой строки, \t преобразуется в символ табуляции и т. Д. Чтобы получить фактический символ \, вы также можете избежать его, поэтому \\ дает один \ ] персонаж. Если символ, следующий за \, не является признанным escape-символом, тогда \ обрабатывается как любой другой символ и проходит через него, но я не рекомендую в зависимости от этого. Вместо этого всегда избегайте ваши символы \, удваивая их, т. Е. \\.

Если вы хотите увидеть, как Python расширяет ваши экраны строк, просто распечатайте строку. Например:

s = 'a\\b\tc'
print s

Если s является частью совокупного типа данных, например. список или кортеж, и если вы напечатаете этот агрегат, Python заключит строку в одинарные кавычки и будет включать экраны \ (в канонической форме), поэтому имейте в виду, как печатается ваша строка. Если вы просто напечатаете в интерпретаторе строку с кавычками, она также отобразит ее в кавычках с экранами '\'.

Как только вы знаете, как кодируется ваша строка, вы можете подумать о том, что re. Например, если вы хотите сбежать \ в строку, которую вы переходите к модулю re, вам необходимо передать \\ в re, что означает, что вам нужно будет использовать \\\\ в вашем цитированном Python строка. Строка Python закончится с \\, а модуль re будет рассматривать это как единственный литерал \.

Альтернативный способ включения символов \ в строках Python - использовать необработанные строки, например r'a\b' эквивалентен "a\\b".

11
ответ дан Tom Karzes 25 August 2018 в 15:24
поделиться

Символ r перед регулярным выражением указывает в вызове search () указывает, что регулярное выражение является исходной строкой. Это позволяет использовать обратную косую черту в регулярном выражении как обычные символы, а не в escape-последовательности символов. Позвольте мне объяснить ...

Прежде чем метод поиска re-модуля обрабатывает переданные ему строки, интерпретатор Python принимает начальный проход по строке. Если в строке присутствуют обратные косые черты, интерпретатор Python должен решить, являются ли они частью escape-последовательности Python (например,\n или \ t) или нет.

Примечание: на данный момент Python не заботится независимо от того, является ли или нет '\' метасимволом регулярного выражения.

Если за «\» следует распознанный escape-символ Python (t, n и т. д.), то обратная косая черта и escape-символ заменяются фактическим Unicode или 8-битным символом. Например, '\ t' будет заменен символом ASCII для вкладки. В противном случае он передается и интерпретируется как символ «\».

Рассмотрим следующее.

>>> s = '\t'
>>> print ("[" + s  + "]")
>>> [       ]           // an actual tab character after preprocessing

>>> s = '\d'
>>> print ("[" + s  + "]")
>>> [\d]                // '\d' after preprocessing

Иногда мы хотим включить в строку последовательность символов, которая включает в себя '\ 'без интерпретации Python как escape-последовательности. Для этого мы убегаем '\' с '\'. Теперь, когда Python видит «\», он заменяет две обратные косые черты одним символом «\».

>>> s = '\\t'
>>> print ("[" + s  + "]")
>>> [\t]                // '\t' after preprocessing

После того, как интерпретатор Python выполнит проход по обеим строкам, они передаются методу поиска re-модуля , Метод поиска анализирует строку регулярных выражений, чтобы идентифицировать метасимволы регулярного выражения.

Теперь '\' также является специальным метасимволом регулярного выражения и интерпретируется как один, если он не убежит в то время, когда выполняется метод re search ().

Рассмотрим следующий вызов.

>>> match = re.search('a\\t','a\\t')        //Match is None

Здесь совпадение - None. Зачем? Давайте посмотрим на строки после того, как интерпретатор Python сделает свой проход.

String 1: 'a\t'
String 2: 'a\t' 

Итак, почему совпадение равно None? Когда search () интерпретирует String 1, поскольку он является регулярным выражением, обратная косая черта интерпретируется как метасимвол, а не обычный символ. Однако обратная косая черта в String 2 не находится в регулярном выражении и уже обработана интерпретатором Python, поэтому ее интерпретируют как обычный символ.

Таким образом, метод search () ищет «escape -t 'в строке' a \ t ', которые не соответствуют.

Чтобы исправить это, мы можем сказать, что метод search () не интерпретирует' \ 'как метасимвол.

Рассмотрим следующий вызов.

>>> match = re.search('a\\\\t','a\\t')          // Match contains 'a\t'

Опять же, посмотрим на строки после того, как интерпретатор Python выполнил свой проход.

String 1: 'a\\t'
String 2: 'a\t'

Теперь, когда метод search () обрабатывает регулярное выражение, он видит, что вторая обратная косая черта сбрасывается первым и не должна считаться метасимволом. Поэтому он интерпретирует строку как «a \ t», которая соответствует строке 2.

Альтернативный способ поиска () считать «\» в качестве символа - поставить r перед регулярным выражением. Это говорит интерпретатору Python, что НЕ препроцессор строки.

Рассмотрим это.

>>> match = re.search(r'a\\t','a\\t')           // match contains 'a\t'

Здесь интерпретатор Python не изменяет первую строку, но обрабатывает вторую строку. Строки, переданные в search (), следующие:

String 1: 'a\\t'
String 2: 'a\t'

Как и в предыдущем примере, поиск интерпретирует «\» как единственный символ «\», а не метасимвол, таким образом, соответствует String 2 .

5
ответ дан eric.mcgregor 25 August 2018 в 15:24
поделиться

Собственный синтаксический анализ Python (частично) на вашем пути.

Если вы хотите увидеть, что видит re, введите

print '\d'
print '\\d'
print '\\\d'

в командной строке Python. Вы видите, что в \d и \\d оба результата приводятся в \d, последний из которых берет на себя парсер Python.

Если вы хотите избежать любых проблем с ними, используйте необработанные строки как предложенный re module documentation : r'\\d' приведет к \\d, видимому модулю RE.

4
ответ дан glglgl 25 August 2018 в 15:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: