РЕГУЛЯРНОЕ ВЫРАЖЕНИЕ: требуется конкретная помощь при сопоставлении ДВОЙНОЙ ОБРАТНОЙ КОСОЙ ЧЕРТЫ в PHP

#php #regex #escaping

#php #регулярное выражение #экранирование

Вопрос:

У меня возникли проблемы с сопоставлением шаблона двойной обратной косой черты с функцией preg_match. Я понимаю, что для буквального сопоставления обратной косой черты вам нужно использовать 4 ( \\ ) для сопоставления с одной косой чертой. Я предположил, что для сопоставления буквальной двойной косой черты, т.Е. \t Будет ( \\\\t ) ?

Похоже, это не распознает шаблон, хотя в моих строках?

Вот что у меня есть на данный момент…

 preg_match("/"amp;?$string:?(\\\\t)?".{1,7}$lang="amp;?(.*?):?"/smi",$cont,$matches);
  

Для дальнейшего объяснения:

Мне нужно, чтобы оно соответствовало следующему…

 "Unlock\t Automatically ar="فتح\t تحديث"

"amp;Unlock Automatically   ar="فتح\t تحديث"

"amp;Unlock: Automatically  ar="فتح\t تحديث"

"amp;Unlock:Something\t Automatically   ar="فتح\t تحديث"
  

Он правильно сопоставляет строки с амперсандами и двоеточиями, но не с косыми чертами?

У всех есть идеи?

Комментарии:

1. t Вероятно, это ваша проблема, поскольку t это вкладка.

2. Да, я так и предполагал, но я не контролирую используемые строковые существа? Существует ли известное обходное решение для этого?

3. Кстати, ни одно из ваших примеров предложений не содержит двойной обратной косой черты.

4. Изучите использование preg_quote динамических строк, используемых в вашем шаблоне. Обязательно укажите параметр delimiter .

5. Нет, спасибо… но preg_quote не делает того, что мне нужно:-(

Ответ №1:

Одна обратная косая черта, '' , используется для экранирования следующего символа. Итак, чтобы захватить одну обратную косую черту, вам нужно '\' . Чтобы захватить double, вам нужно '\\' .

 preg_match('/(\\)/i', 'فتح\t تحديث', $result);
$result = Array
(
    [0] => \
    [1] => \
)
  

У вас также есть ‘t’, который сам по себе экранируется в строке, но по другим причинам. Итак, чтобы захватить все в одном:

 preg_match('/(\\t)/i', 'فتح\t تحديث', $result);
$result = Array
(
    [0] => \t
    [1] => \t
)
  

Должно быть достаточно, чтобы вы начали. Дайте мне знать, если вам потребуется дополнительная помощь.

PS Вот отличный инструмент для тестирования регулярных выражений в PHP (PCRE RegEx) — http://regex.larsolavtorvik.com /