Рубрики
Uncategorized

Получение интервью на PHP – Расположение Точек Знаний о регулярных Выражениях

Автор оригинала: David Wong.

I. Введение

1. Что такое регулярное выражение?

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

2. Роль регулярных выражений

Сегментация, Поиск, Сопоставление, Замена Строк

3. Регулярные выражения в PHP

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

Один из них предоставляется библиотекой регулярных выражений, совместимой с Perl. Функция с префиксом “preg_”; Набор предоставляется расширением POSIX (Интерфейс портативной операционной системы Unix). Используйте функцию, названную с префиксом “ereg UU”.;

PCRE происходит от Perl, а Perl-один из самых мощных языков для обработки строк. Оригинальная версия PHP была разработана компанией Perl. Грамматика PCR E поддерживает больше функций и является более мощной, чем грамматика POSIX. Поэтому в этой статье в основном представлены PCRE Регулярные выражения грамматики

4. Состав регулярных выражений

В PHP регулярное выражение делится на три части: разделитель, выражение и модификатор шаблона.

Разделитель

Разделители могут быть разделены буквами, цифрами, обратными косыми чертами( \ ) и любым символом ASCII, отличным от пустого символа. Наиболее часто используемым разделителем является косая черта. ( / Хэш-символы( # ) И возьмите антисимволы( ~ ).

Выражение

Есть некоторые специальные символы и не специальные строки. Это основная часть определения правил сопоставления регулярных выражений.

модификатор рисунка

Используется для включения и выключения определенных функций/режимов.

2. Разделитель

1. Выбор сепараторов

При использовании функции PCRE регулярное выражение должно быть заключено в разделитель. Разделители могут быть разделены буквами, цифрами, обратными косыми чертами( \ ) и любым символом ASCII, отличным от пустого символа. Наиболее часто используемым разделителем является косая черта. ( / Хэш-символы( # ) И возьмите антисимволы( ~ ).

/ foo bar/ (legal)
#^ [^0-9]$# (legal)
+ PHP + (legal)
% [a-zA-Z0-9-]% (legal)
# [a-zA-Z0-9_-]/ (illegal, with different separators on both sides)
A [a-zA-Z0-9_-]a (illegal, delimiters cannot be letters)
\ [a-zA-Z0-9_-] (Illegal, the separator cannot be a backslash (`\))

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

{this is a pattern}

2. Использование сепараторов

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

/http:\/\//
#http://#

Когда строку необходимо поместить в регулярные выражения, ее можно экранировать с помощью функции preg_quote (). Его второй (необязательный) параметр можно использовать для указания разделителя, который необходимо экранировать.

// In this example, preg_quote ($word) is used to preserve the original meaning of asterisks and forward slashes (/) so that it does not use the special semantics in regular expressions.
$textBody = "This book is */very/* difficult to find.";
$word = "*/very/*";
$reg = "/" . preg_quote($word, '/') . "/";

Echo $reg; //output'/* very very /\ */'

Echo preg_replace ($reg, "", $word. "", $textBody); //output'This book is */very/* difficult to find. '

Модификатор шаблона может быть добавлен после разделителя конца, чтобы повлиять на эффект сопоставления. Следующий пример-совпадение без учета регистра

#[a-z]#i

3. Метасимволы

1. символ побега

Отметьте следующий символ как специальный символ, или буквенный символ, или обратную ссылку. Например, “n” соответствует символу “n”. “n” соответствует символу новой строки. Последовательность” совпадения “и”(“совпадения”(). \

2. локатор

Сопоставьте начальную позицию входной строки (или начало в многострочном режиме) ^
Соответствует конечной позиции входной строки (или заканчивается в многострочном режиме) $
Сопоставление границы слова, положение слов и пробелов \b
Сопоставление границ без слов \B

3. квалификатор

Сопоставьте предыдущее подвыражение ноль или более раз. Например, zo Может совпадать с “z” и “zoo”. Эквивалентно {0,}. *
Сопоставьте предыдущее подвыражение один или несколько раз. Например, ” zo+”соответствует Zo и zoo, но не Z. + Эквивалентно {1,}. +
Когда символ используется в качестве квантора, это означает, что подвыражение перед совпадением равно нулю или один раз. Например, “делать (а)?” может совпадать с “делать” или “делать”. Эквивалентно {0,1}. ?
N-неотрицательное целое число. Соответствие определяется n раз. Например,” O {2} “не соответствует” в “Бобе”, но соответствует двум ” о ” в “еде”. {n}
N-неотрицательное целое число. Совпадение по крайней мере n раз. Например, “O {2,} “не соответствует” в “BOB”, но соответствует всем ” o ” в “foood”. ‘ O {1,}’эквивалентно “o+”. “O {0,}”эквивалентно” o*”. {n,}
M и N – неотрицательные целые числа, где n. Не менее n совпадений и не более M совпадений. Например, “o {1,3}” соответствует первым трем ” о “в” foooood”. ‘ O {0,1}’эквивалентно “o?”. Пожалуйста, обратите внимание, что между запятыми и двумя цифрами не должно быть пробелов. {n,m}

4. Общие характеристики

Сопоставьте числовой символ. Эквивалентно[0-9]。 \d
Соответствует нечисловому символу. Эквивалентно[^0-9]。 \D
Сопоставьте буквы, цифры, знаки подчеркивания. Эквивалентно[A-Za-z0-9_] 。 \w
Сопоставьте не буквы, цифры, знаки подчеркивания. Эквивалентно[^A-Za-z0-9_]。 \W
Сопоставьте любые пустые символы, включая пробелы, вкладки, разрывы страниц и так далее. Эквивалентно[ \f\n\r\t\v]。 \s
Соответствует любым непустым символам. Эквивалентно[^ \f\n\r\t\v]。 \S
Сопоставьте любой отдельный символ, кроме символов новой строки (n, r). Чтобы соответствовать любому символу, включая’, используйте что-то вроде'(. . N) “Регулярное выражение.

5. Непечатаемые символы

Соответствует символу новой строки. Эквивалентно x0 и cJ. \n
Сопоставьте возврат кареты. Эквивалентно x0d и см. \r
Сопоставьте вкладку. Эквивалентно X09 и cI. \t

6. Ветвление с множественным выбором

Вертикальные символы | могут совпадать с несколькими выборками. Например, “z | еда” может совпадать с “z” или “еда”. ‘ ((z | f | g) уд ‘ соответствует “зуд”, “еда” или “хорошо”. |

7. набор символов

Сопоставьте X или y. Например, ” z | еда может соответствовать “z” или “еда””. ((z | f) уд ‘ соответствует “зуд” или “еда”. [х / у]
Набор символов. Соответствует любому содержащемуся символу. Например,[abc]Вы можете сопоставить “a” простым”. [xyz]
Набор отрицательных символов. Соответствует любому символу, который не включен. Например,[^abc]Вы можете сопоставить “p”, “l”, “i”,”n “в ” обычном”. [^xyz]
Диапазон символов. Соответствует любому символу в указанном диапазоне. Например,[az]Вы можете сопоставить любой строчный символ в диапазоне от “a” до “z”. [а-я]
Диапазон отрицательных символов. Соответствует любому символу, который не входит в указанный диапазон. Например,[^a-z]Может быть сопоставлен любой символ, который не входит в диапазон a’to’z’. [^а-я]

8. Не жадные совпадения

Соответствующий шаблон не является жадным, когда символ следует за любым другим ограничителем (*,+,?, {n}, {n,}, {n, m}). Не Жадный шаблон соответствует как можно меньшему количеству строк, в то время как жадный шаблон по умолчанию соответствует как можно большему количеству строк. Например, ” o+?”соответствует одной букве “o” для строки “oooo”, а ” o+” соответствует “разрешить”. ?

9. ( ) Группировка

Сопоставьте шаблон и получите совпадение. Чтобы соответствовать скобкам, используйте\(или\)。 (рисунок)
Сопоставьте шаблон, но не получите соответствующего результата, то есть это не совпадение, и оно не сохраняется для последующего использования. Это полезно при объединении частей регулярного выражения с символом ИЛИ (|). Например, “отрасль y” (?: y | ies) является более простым выражением, чем “отрасль | отрасли”. (?:шаблон)
Положительное утверждение Lookahead соответствует строке поиска в начале любой строки, соответствующей шаблону. Это совпадение не является приобретением, то есть совпадение не нужно приобретать для последующего использования. Например, “Windows | 98 | NT | 2000)” может соответствовать “Windows” в “Windows 2000”, но не “Windows” в “Windows 3.1”. Предварительный просмотр не использует символы, то есть после совпадения поиск следующего совпадения начинается сразу после последнего совпадения, а не после того, как символ содержит предварительный просмотр.
Отрицательное утверждение соответствует строке поиска в начале любой строки, которая не соответствует шаблону. Это совпадение не является приобретением, то есть совпадение не нужно приобретать для последующего использования. Например, “Окна (?! 95/98 | NT | 2000)” может соответствовать “Windows” в “Windows 3.1”, но не “Windows” в “Windows 2000”. Предварительный просмотр не использует символы, то есть после совпадения поиск следующего совпадения начинается сразу после последнего совпадения, а не после того, как символ содержит предварительный просмотр. (?!шаблон)
Взгляд за утвердительное предсказание аналогичен прямому утвердительному предсказанию, но в противоположном направлении. Например, | 98 | NT | 2000) Windows” может соответствовать “Windows” в “2000 Windows”, но не “Windows” в “3.1 Windows”.
Обратное отрицательное предсказание похоже на положительное отрицательное предсказание, но в противоположном направлении. Например “(? (?

Модификаторы режимов

1. I (без учета регистра)

Если этот модификатор установлен, буквы в регулярном выражении будут совпадать без учета регистра.

2. м (многострочный режим)

По умолчанию PCRE предполагает, что целевая строка состоит из одной строки символов (на самом деле, однако, она может содержать несколько строк). Метасимвол главы строки( ^ ) Соответствует только началу строки, в то время как метасимвол конца строки( $ ) Соответствует только концу строки или последнему символу новой строки (если не установлен модификатор D).

Когда этот модификатор установлен, метасимволы “начало строки” ( ^ ) и “конец строки” ( $ ) Он совпадает до или после любого символа новой строки в целевой строке, а также соответствует началу и концу целевой строки соответственно.

Если в целевой строке нет символа “n” или если в регулярном выражении нет символа “n” ^ или $ Установка этого модификатора не имеет никакого эффекта.

3. с (Режим “Точка-точка”)

По умолчанию номер точки( . ) Непревзойденный символ новой строки. Если этот модификатор установлен, символ точки в регулярном выражении соответствует всем символам, включая символы новой строки.

4. U (жадная модель)

Этот модификатор соответствует упомянутому ранее. ? Функция та же самая, так что регулярное выражение по умолчанию использует не жадное сопоставление. В случае использования модификатора U добавьте квантор после квантора ? Это может быть превращено в жадное совпадение (отрицательное есть положительное).

В режиме без жадности символы, превышающие pcre. backtrack_limit обычно не совпадают.

Жадный режим

$str = 'abcdef';
$pattern = '|(.*)|';
preg_match_all($pattern, $str, $matches);

. * Будет соответствовать abc защита

В случае модификатора U добавьте после квантора ? Отрицательный или отрицательный – все равно жадное совпадение

$str = 'abcdef';
$pattern = '|(.*?)|U';
preg_match_all($pattern, $str, $matches);

. * Будет соответствовать abc защита

Не Жадная модель

Способ 1. Воспользуйся ? Обратимся к не жадной модели

$str = 'abcdef';
$pattern = '|(.*?)|';
preg_match_all($pattern, $str, $matches);

. * Будет соответствовать отдельно азбука , защита

Способ 2. Используйте модификаторы U Обратимся к не жадной модели

$str = 'abcdef';
$pattern = '|(.*)|U';
preg_match_all($pattern, $str, $matches);

. * Будет соответствовать отдельно азбука , защита

5. u (Поддержка экспрессии трансгена UTF-8)

Этот модификатор делает как регулярные выражения, так и целевые строки кодировкой UTF-8. Недопустимые целевые строки приводят к тому, что функции preg_* не совпадают ни с чем; недопустимые строки регулярных выражений вызывают ошибки на уровне E_WARNING.

STR = Chinese;

$pattern = '/^[\x{4e00}-\x{9fa5}]+$/u';

if (preg_match($pattern, $str)) {
    Echo'This string is all Chinese';
} else {
    Echo 'the string is not all Chinese';
}

6. D (Окончание Ограничения)

По умолчанию, если используется $ , Ограничьте конечный символ, когда строка заканчивается символом новой строки, Символы $ также соответствуют символу новой строки (но не соответствуют ни одному предыдущему символу новой строки). Если этот модификатор установлен, символы $ соответствуют только концу целевой строки. Если установлен модификатор m, модификатор игнорируется.

7. x

Если этот модификатор установлен, пустые символы данных в регулярных выражениях, которые не были экранированы или не входят в классы символов, всегда игнорируются, а символы между символами # и следующим разрывом строки, которые находятся за пределами класса экранированных символов, также игнорируются.

8. A

Если этот модификатор установлен, регулярное выражение принудительно переходит в режим “привязки”, то есть сопоставление ограничений заставляет его искать только с начала целевой строки.

9. S

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

V. Обратное цитирование

Использовать ( ) Атомы в начале и конце тега являются не только независимой единицей, но и подвыражением. В одном ( ) За пределами подвыражения обратная косая черта следует за числом, большим 0, что является обратной ссылкой на предыдущее подвыражение. Обратные ссылки используются для повторения предыдущего поиска ( ) Текст, в котором совпадает подвыражение.

1. Используйте обратные ссылки в регулярных выражениях

(sens|respons)e и \1. Это будет соответствовать “чувству и чувствительности” и “реакции и ответственности” вместо “чувства и ответственности”.

2. Используйте обратную ссылку в функции PCRE

php
$str = 'abcdef';
$pattern = '/(.*)<\/b>(.*)<\/b>/';
$replace = preg_replace($pattern, '\1', $str);
echo $replace . "\n";

$replace = preg_replace($pattern, '\2', $str);
echo $replace . "\n";

Выход:

abc
def

6. Общие функции PCRE для регулярных выражений

Объяснение официального сайта PHP очень подробное, поэтому здесь больше нет лишних обсуждений.

Выполните регулярное выражение, соответствующее preg_match()

Выполните глобальное сопоставление регулярных выражений preg_match_all()

Выполните поиск по регулярному выражению и замените preg_replace()

Выполните поиск по регулярному выражению и замените функцию preg_replace_callback() на обратный вызов

Выполните несколько поисков по регулярным выражениям и замените функцию preg_replace_callback_array() соответствующими обратными вызовами

Разделите строку preg_split() регулярным выражением

VII. Практика Применения

1. Регулярные выражения соответствуют китайским

Диапазон кодирования китайских символов UTF-8 составляет 0x4e00-0x9fa5 В среде ANSI (GB2312), 0xb0-0xf7 , 0xa1-0xfe

UTF-8 использует модификатор u-mode, чтобы сделать строку шаблона UTF-8 В среде ANSI (GB2312) использовать Chr для преобразования кода Ascii в символы

UTF-8

ANSI(GB2312)

2. Регулярные выражения соответствуют значениям SRC во всех тегах img на странице.

';

$pattern = '//i';

preg_match($pattern, $str, $match);

var_dump($match);

Оригинал: “https://developpaper.com/getting-php-interview-regular-expression-knowledge-points-arrangement/”