Регулярное выражение может сохранять множество условных выражений, циклов и строковых функций, упрощая код. Однострочный код регулярных выражений выглядит элегантно и гораздо более читабельно.
Я делюсь здесь некоторыми примерами. Первые три – это проблемы PHP и Javascript и их решение, за которыми следует решение регулярных выражений.
Остальные три примера касаются использования регулярных выражений в базе данных SQL, веб-серверах Apache, Nginx и оболочке Linux.
Содержание
- Время прочитать статью
- Проверка имени пользователя Gmail
- Проверка IP-адреса
- Регулярное выражение в SQL
- Регулярное выражение в Apache, Nginx веб-сервер
- Оболочка 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является допустимым адресом IPv4257.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 до 991[0-9][0-9]соответствует числам от 100 до 1992[0-4][0-9]соответствует числам от 200 до 24925[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”