Автор оригинала: 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
Выход:
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/”