PHP: класс для генерации пары слов "Имя+Фамилия"
Добавлю этот небольшой класс в коллекцию PHP-функций, которые всё ещё могут пригодиться при автоматической генерации контента и не только.
Используя 3 содержащихся в архиве небольших файла-словаря:
- male.txt - русские мужские имена, более 600
- female.txt - русские женские имена, более 500
- last.txt - русские фамилии в мужской (или единственной) форме, более 1100
класс getRussianNames
генерирует и возвращает с помощью метода get
список из нужного количества мужских или женских имён и фамилий:
- параметр конструктора класса
__construct
$n
задаёт нужное количество имён-фамилий, по умолчанию 1; - параметры метода
get
-$gender
(пол, равенtrue
для мужского) и$div
(разделитель элементов списка, по умолчанию тег разрыва строки + текстовый перевод строки).
Больше русских фамилий одним файлом было вот тут. Для женской формы русской фамилии отдельного словаря нет, функция getWomanForm
склоняет их по простейшим правилам:
- для -ов, -ев, -ёв, -ин, -ын в конце фамилии добавляем -а;
- -ый, -ий в конце убираем и заменяем на -ая.
Все файлы и сам скрипт - в однобайтовой кодировке Windows-1251, для работы с Юникодом, возможно, придётся немного поправить регулярные выражения.
Также код показывает, как включённый через include
или require
скрипт может узнать свою текущую папку, например, если файлы скрипта находятся на сервере во вложенной папке namelist
, а вызывается (и берёт дополнительные файлы-словари) он из папки, находящейся уровнем выше, как и показано в коде. Менять что-либо в коде класса в норме не придётся.
Вот исходники и результат тестового прогона:
Файл класса namelist/index.php
<?php class getRussianNames { private $n, $ready, $fmale, $ffemale, $flast; public function __construct ($n=1) { $this->n = $n; $this->fmale=dirname(__FILE__).'/'.'male.txt'; $this->ffemale=dirname(__FILE__).'/'.'female.txt'; $this->flast=dirname(__FILE__).'/'.'last.txt'; $this->ready = (file_exists($this->fmale) and filesize($this->fmale)>1 and file_exists($this->ffemale) and filesize($this->ffemale)>1 and file_exists($this->flast) and filesize($this->flast)>1); } private function getWomanForm ($last) { $last = preg_replace ("/^(.+)(ов|ев|ёв|ин|ын)$/","$1$2а",$last); $last = preg_replace ("/^(.+)(ый|ий)$/","$1ая",$last); return $last; } public function get ($gender=true,$div="<br />\n") { $str = ''; if (!$this->ready) return 'Неизвестное Ноунейменко'; $male = file($this->fmale,FILE_IGNORE_NEW_LINES); $female = file($this->ffemale,FILE_IGNORE_NEW_LINES); $last = file($this->flast,FILE_IGNORE_NEW_LINES); shuffle($male); shuffle($female); shuffle($last); for ($i=0; $i<$this->n; $i++) { $str .= ($gender ? $male[$i] . ' ' . $last[$i] : $female[$i] . ' ' . $this->getWomanForm($last[$i])); if ($i<$this->n-1) $str .= $div; } return $str; } } //class getRussianNames end ?>
Файл namelist.php с вызовом класса из вложенной папки namelist
<?php require_once('namelist/index.php'); $list = new getRussianNames(10); echo $list->get(true); echo "<br />\n"; echo $list->get(false); ?>
Случайный результат прогона
Памфил Бендлин Геронтий Соболевский Ульманас Жуков Пимен Никифоров Гастон Делов Исай Лепёхин Сергей Аношкин Илларион Голубов Винсент Перов Камиль Снаткин Анэля Харченко Нинель Терентьева Клеопатра Посохова Елизавета Островская Агния Шестакова Ада Ласкутина Аксинья Дмитриева Анжела Пичугина Таира Расторгуева Иоанна Царёва
Скачать файлы скрипта и словари в архиве .zip (10 Кб)
14.02.2017, 14:57 [5594 просмотра]