PHP strpos() из \\\\\\\\r\\\\\\\\n символов

У меня есть текст в базе данных MySQL, который запрашивается в «$description», и я хотел бы знать, присутствует ли \\\\\\\\r\\\\\\\\n в описании. Итак, я получил:

if(strpos($description, "\\\\\\\\r\\\\\\\\n") !== FALSE) {
echo "String is here.";
} else {
echo "String not found.";
}

но это всегда выводит «Строка не найдена». и я считаю, что в искомой строке (\\\\\\\\r\\\\\\\\n) есть плохое экранирование. Как я могу strpos по \\\\\\\\r\\\\\\\\n ? Кроме того, я, вероятно, закончил бы тем, что str_replace каждый \\\\\\\\r\\\\\\\\n с \r\n, поскольку кто-то сделал несколько плохих экранирующих функций, и данные поступили как \\\\\\\\r\\\\\\\\n вместо \r\n, поэтому str_replace также сталкивается с той же проблемой. Мне не помешала бы помощь по любой из этих задач (str_pos,str_replace).

Спасибо большое.


person Manny Calavera    schedule 17.03.2011    source источник
comment
Кажется, что stackoverflow вырезал некоторые \s там, где не было тегов кода. Код в тегах — это искомая строка.   -  person Manny Calavera    schedule 17.03.2011
comment
Просветите меня, а?   -  person Manny Calavera    schedule 17.03.2011
comment
@Мэнни использует обратные кавычки `` для ввода необработанного текста.   -  person Rafe Kettler    schedule 17.03.2011
comment
Там действительно нет никакого просветления. Лучше вообще не генерировать такие строки, и, конечно же, ваш язык не должен создавать их за вас.   -  person Ignacio Vazquez-Abrams    schedule 17.03.2011
comment
@ Игнасио, это не PHP. это какой-то программист использует его. Почувствуйте разницу   -  person Your Common Sense    schedule 17.03.2011
comment
Метод, позволяющий избежать проблем с экранированием строк в PHP, состоит в том, чтобы поместить нужную строку поиска в необработанный текстовый файл. Затем используйте $subject = trim(file_get_contents("exact.txt")), чтобы он содержал значение, отображаемое в текстовом редакторе.   -  person mario    schedule 17.03.2011
comment
Я не производил это \\\\\\\\r\\\\\\\\n . Я просто предположил, что бежать было плохо. Я должен исправить это для текущих введенных данных, но не хочу заменять в mysql, я хочу заменить на дисплее. Поэтому я хотел бы заменить \\\\\\\\r\\\\\\\\n на \r\n в $description . Спасибо.   -  person Manny Calavera    schedule 17.03.2011


Ответы (2)


Неудачный характер обнаружения символа обратной косой черты заключается в том, что он также является универсальным символом экранирования. И чтобы поместить буквальную обратную косую черту в строку, вы должны экранировать ее - с самой собой

То есть, если вы хотите обнаружить одиночный обратный слеш, ваш код может выглядеть так:

if(strpos($description, '\\' ) !== FALSE)

Следовательно, если вы хотите обнаружить восемь последовательных обратных косых черт, вашей строке для сопоставления потребуется вдвое больше - шестнадцать.

if(strpos($description, '\\\\\\\\\\\\\\\\' ) !== FALSE)

Таким образом, ваше окончательное совпадение с использованием strpos() должно выглядеть так:

if(strpos($description, '\\\\\\\\\\\\\\\\r\\\\\\\\\\\\\\\\n' ) !== FALSE)

Также заметил, что я перешел на одинарные кавычки. Это потому, что \n и \r интерпретируются внутри строковых литералов в двойных кавычках.

Вы также можете сделать это с помощью регулярных выражений, которые будут немного более гибкими и мощными.

if ( preg_match( "/\\x5C{8}[rn]/", $description ) )

РЕДАКТИРОВАТЬ

Для поиска-замены я предлагаю что-то вроде этого. Как я упоминал выше, регулярное выражение будет более мощным - оно будет сопоставлять \r или \n (и не только когда они стоят рядом) с ЛЮБЫМ количеством предшествующих обратных косых черт, а не только 8 из них.

$description = preg_replace( "/\\x5C+([rn])/", '\\\${1}', $description );
person Peter Bailey    schedule 17.03.2011
comment
Если количество обратных слэшей четное, то print '\\\\n' идентично print "\\\\n" — токенизатор обрабатывает строки в двойных кавычках не хуже, чем в одинарных. - person mario; 17.03.2011
comment
@марио - да, это правда. Я все еще думаю, что более прагматично использовать для таких вещей одинарные кавычки. - person Peter Bailey; 17.03.2011
comment
@ Мэнни, я также добавил предложение поиска / замены. - person Peter Bailey; 17.03.2011
comment
\n не следует заменять буквальным \n, я считаю. - person Your Common Sense; 17.03.2011

if(strpos($description, '\\\\\\\\\\\\\\\\r\\\\\\\\\\\\\\\\n') !== FALSE) {
echo "String is here.";
} else {
echo "String not found.";
}

дополнительная литература

person Your Common Sense    schedule 17.03.2011