Рубрики
Uncategorized

Упрощение кода с помощью регулярных выражений

Регулярное выражение может сохранять множество условных выражений, циклов и строковых функций, делая код простым… Помеченный регулярными выражениями, php, javascript.

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

Я делюсь здесь некоторыми примерами. Первые три – это проблемы PHP и Javascript и их решение, за которыми следует решение регулярных выражений.

Остальные три примера касаются использования регулярных выражений в базе данных SQL, веб-серверах Apache, Nginx и оболочке Linux.

Содержание

  1. Время прочитать статью
  2. Проверка имени пользователя Gmail
  3. Проверка IP-адреса
  4. Регулярное выражение в SQL
  5. Регулярное выражение в Apache, Nginx веб-сервер
  6. Оболочка Linux

Пример 1:

Время прочитать статью

Согласно исследованию, опубликованному в журнале “Память и язык” ( М. Брайсберт ), мы читаем 238 слов в минуту. Эта функция вернет минуты на чтение введенного текста.

function minutesToRead($text){

   $total_words = str_word_count(implode(" ", $text));
   $minutes_to_read = round($total_words / 238);
   return max($minutes_to_read, 1);
}

echo minutesToRead($content) . ' min read'

Вместо того, чтобы разбивать текст на массив слов, мы считаем пробелы \s в тексте. Мы также можем использовать \w+ для подсчета слов.

PHP (регулярное выражение)

function minutesToRead($text){

   $total_words = preg_match_all('/\s/', $text, $match);
   return max(round($total_words / 238), 1);
}

Javascript (регулярное выражение)

function minutesToRead(text){

   const word_count = text.match(/\s/g).length;
   return Math.max(Math.round(word_count / 238), 1);
}

PHP preg_match_all соответствует всем вхождениям. В Javascript флаг группы \g используется для получения всех совпадений.

Если текст содержит HTML-теги, используйте PHP полосатые_теги чтобы удалить эти теги в Javascript, используйте одно из этих регулярных выражений для удаления тегов.

/<[\w\s"-.=%#;'""!?…{}()\d:\/]+>/g
OR
/<[^<]+>/g

Пример 2:

Проверка имени пользователя Gmail

Ввод имени пользователя требует проверки на соответствие этим правилам:

  • начинается с английской буквы
  • содержит только английские буквы, цифры и точку (.)
  • минимум 6, максимум 30 символов длиной

Для решения без регулярных выражений потребуются отдельные блоки кода для каждого правила преобразования строки в массив с использованием функции filter и нескольких условных выражений для реализации всех правил проверки в коде.

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

PHP

function isValidUsername($username){

    return preg_match("/^[a-z][a-z0-9.]{5,29}$/i", $username) === 1;
}

Язык JavaScript

function usernameIsValid(username){

   return /^[a-z][a-z0-9.]{5,29}$/i.test(username);
}
  • ^[^[az] гарантирует, что имя пользователя начинается с буквы в диапазоне- z.
  • [a-z0-9.] проверяет, что остальная часть имени пользователя содержит только буквенно-цифровые значения и точку.
  • {5,29} проверяет, находится ли длина строки в допустимом диапазоне.

  • флаг i используется для сопоставления без учета регистра.

Пример 3:

Проверка IP-адреса

Адрес IPv4 представляет собой набор из четырех 8-битных целых чисел (от 0 до наибольшего 8-битного целого числа 255), разделенных точкой (.).

Примеры:

192.168.0.1 является допустимым адресом IPv4

  • 255.255.255.255 является допустимым адресом IPv4

  • 257.100.92.101 недопустимый IPv4-адрес, поскольку 257 слишком велик, чтобы быть 8-битным целым числом

  • 255.100.81.160.172 недопустимый IPv4-адрес, поскольку он содержит более четырех целых чисел

  • 1..0.1 не является допустимым адресом IPv4, поскольку он неправильно отформатирован

  • 17.233.00.131 и 17.233.01.131 не являются допустимыми адресами IPv4, так как оба содержат начальные нули

Javascript (без регулярных выражений)

function isIPv4Address(inputString) {

   let ip = inputString.split('.');
   return ip.filter((e)=>{return e.match(/\D/g) || e > 255 || 
   parseInt(e) != e;}).length == 0 && ip.length === 4;
}

PHP filter_var имеет IP-валидатор таким образом, нам не нужно писать здесь регулярное выражение.

PHP

filter_var("192.168.00.1", FILTER_VALIDATE_IP, FILTER_FLAG_IPV4);

Javascript (регулярное выражение)

function isIPv4Address(inputString) {

   const ip = inputString.split('.');
   if(ip.length !== 4) {return false};
   return ip.every(e => /^([1-9]?[0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$/.test(e));
}

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

  • [1-9]?[0-9] соответствует числам от 0 до 99

  • 1[0-9][0-9] соответствует числам от 100 до 199

  • 2[0-4][0-9] соответствует числам от 200 до 249

  • 25[0-5] соответствует числу от 250 до 255

  • | является ИЛИ ^ , $ отмечает начало и конец регулярного выражения

Пример 4:

Регулярное выражение в SQL

Например, для извлечения инициалов из столбца имя таблицы.

Запрос MySQL

SELECT 
    id,
    name,
    REGEXP_REPLACE(name, '(.{1})([a-z]*)(.*)$','$1\.$3') AS REGEXP_name 
FROM students;

результат

id  name                REGEXP_name

33  Lesa Barnhouse      L. Barnhouse
38  Kurtis Saulters     K. Saulters
40  Charisse Lake       C. Lake
  • (.{1}) группа 1 соответствует первому символу имени
  • ([a-z]*) группа 2 соответствует алфавитам до пробела
  • (.*) группа 3 совпадает с остальной частью имени до конца
  • $1\.$3 выводит значение группы1, . и значение группы 3

Примечание: Поддержка регулярных выражений MySQL не является обширной, и маркеры класса символов отличаются: например: [:альфа:] вместо стандартного \w . Более подробная информация о MySQL Руководство по регулярным выражениям и поваренная книга О’Рейли .

Пример 5:

Регулярное выражение в Apache, Nginx веб-сервер

Например, блог с URL articles.php?id=123 использует article_id для отображения запрошенных статей. Измените его на удобный для SEO URL, например articles/category/title-of-article_123.html в блоге. Практически у всех статей теперь есть отдельная страница с идентификатором и соответствующими ключевыми словами в названии.

Веб-сервер может регулярно сопоставлять новые URL-адреса SEO с параметром id, передавать его в скрипт и отображать вывод скрипта для URL-адреса.

Апач2

RewriteRule "_([0-9]+).html$" "/articles.php?article_id=$1"

Nginx

rewrite "_([0-9]+).html$" "/articles.php?article_id=$1";

Пример 6:

Оболочка Linux

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

Чтобы узнать значение директивы AllowOverride в файле конфигурации apache.

grep -C 2 'AllowOverride' /etc/apache2/apache2.conf

-C 2 флаг добавляет дополнительные строки для контекста, AllowOverride соответствует точному слову. Команда выводит это


    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted

Чтобы найти максимальный размер файла загрузки PHP, не открывая длинный конфигурационный файл php.ini .

grep 'upload.*size' /usr/local/etc/php/php.ini

выходы upload_max_filesize размер файла

Дополнительная информация о grep на gnu grep и руководство страница.

Вывод

Изучение некоторых базовых регулярных выражений и изучение различных вариантов использования может помочь вам получить представление о возможностях регулярных выражений. Знание того, где использовать регулярные выражения при написании кода и решении проблем, может помочь в написании эффективного кода. Элегантный, читаемый код – это бонус.

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

Фотография в заголовке Майкл Дзедзич

Оригинал: “https://dev.to/waqar/keeping-code-simple-with-regular-expressions-1a5p”