Skip to content

Commit bee5484

Browse files
UnMelowJonPurvis
authored andcommitted
Feature/ru profanity (#74)
1 parent 756628f commit bee5484

File tree

4 files changed

+309
-0
lines changed

4 files changed

+309
-0
lines changed

src/Config/profanities/ru.php

Lines changed: 221 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,221 @@
1+
<?php
2+
3+
return [
4+
'алкаш',
5+
'бастард',
6+
'бля',
7+
'блядвон',
8+
'бляди',
9+
'блядина',
10+
'блядища',
11+
'блядки',
12+
'блядовать',
13+
'блядоеб',
14+
'блядский',
15+
'блядство',
16+
'блядун',
17+
'блядь',
18+
'блять',
19+
'бомжара',
20+
'впизду',
21+
'вхуярить',
22+
'выблядок',
23+
'выебать',
24+
'выебывается',
25+
'выебываться',
26+
'высрать',
27+
'гнида',
28+
'говнецо',
29+
'говнистый',
30+
'говнище',
31+
'говно',
32+
'говнюк',
33+
'говнючка',
34+
'говняк',
35+
'говняный',
36+
'гомик',
37+
'дерьмище',
38+
'дерьмо',
39+
'дерьмовый',
40+
'доебаться',
41+
'долбоеб',
42+
'долбоящер',
43+
'долбоёб',
44+
'дристать',
45+
'дрищ',
46+
'ебало',
47+
'ебальник',
48+
'ебанутый',
49+
'ебаный',
50+
'ебать',
51+
'ебать-копать',
52+
'ебаться',
53+
'еблан',
54+
'ебло',
55+
'ебучий',
56+
'ебучка',
57+
'ебёт',
58+
'жид',
59+
'жиды',
60+
'заебал',
61+
'заебали',
62+
'заебался',
63+
'заебать',
64+
'заебистый',
65+
'заебись',
66+
'засереть',
67+
'засранец',
68+
'засрать',
69+
'захуячить',
70+
'лесбо',
71+
'мерзавец',
72+
'москаль',
73+
'мудак',
74+
'мудила',
75+
'мудило',
76+
'мудозвон',
77+
'наебал',
78+
'наебалово',
79+
'наебать',
80+
'наебка',
81+
'нарик',
82+
'насрал',
83+
'насрать',
84+
'нахуячиться',
85+
'негодяй',
86+
'нехуй',
87+
'нигга',
88+
'ниггер',
89+
'нимфоманка',
90+
'нихуя',
91+
'обосравшийся',
92+
'обосрал',
93+
'обосрать',
94+
'обосраться',
95+
'обоссать',
96+
'обоссы',
97+
'обсирать',
98+
'опиздолить',
99+
'отъебаться',
100+
'отъебись',
101+
'охуевший',
102+
'охуел',
103+
'охуенно',
104+
'охуенный',
105+
'охуеть',
106+
'педераст',
107+
'педик',
108+
'перехуярить',
109+
'пидарас',
110+
'пидор',
111+
'пидорас',
112+
'пидорасы',
113+
'пидоры',
114+
'пидорёныш',
115+
'пизда',
116+
'пизданул',
117+
'пизданутый',
118+
'пиздануть',
119+
'пиздатее',
120+
'пиздато',
121+
'пиздатый',
122+
'пиздеж',
123+
'пиздеть',
124+
'пиздец',
125+
'пиздишь',
126+
'пиздобол',
127+
'пиздобратия',
128+
'пиздой',
129+
'пиздомать',
130+
'пиздуй',
131+
'пизды',
132+
'пиздюк',
133+
'пиздюлина',
134+
'пиздюлить',
135+
'пиздюля',
136+
'пиздёж',
137+
'пиздёныш',
138+
'подонок',
139+
'подъебать',
140+
'подъебка',
141+
'поебень',
142+
'похуй',
143+
'похую',
144+
'проебал',
145+
'проебать',
146+
'просрал',
147+
'просрать',
148+
'проститутка',
149+
'проёб',
150+
'разпиздеть',
151+
'разхуячить',
152+
'распиздяй',
153+
'распиздяйство',
154+
'сволочь',
155+
'скотина',
156+
'спиздил',
157+
'спиздить',
158+
'спизжен',
159+
'спизженный',
160+
'сраный',
161+
'срать',
162+
'сраться',
163+
'срачуга',
164+
'срущий',
165+
'ссаный',
166+
'ссать',
167+
'сука',
168+
'сука блять',
169+
'суки',
170+
'сукин',
171+
'сукин сын',
172+
'сучара',
173+
'сучий',
174+
'сучка',
175+
'сучонок',
176+
'схуяли',
177+
'съебал',
178+
'съебаться',
179+
'тварь',
180+
'ублюдки',
181+
'ублюдок',
182+
'узкоглазый',
183+
'урод',
184+
'уроды',
185+
'хач',
186+
'хачи',
187+
'хохлы',
188+
'хохол',
189+
'хуево',
190+
'хуевый',
191+
'хуеплет',
192+
'хуеплёт',
193+
'хуерик',
194+
'хуесос',
195+
'хуесосы',
196+
'хуи',
197+
'хуила',
198+
'хуило',
199+
'хуиня',
200+
'хуистый',
201+
'хуй',
202+
'хуйней',
203+
'хуйни',
204+
'хуйня',
205+
'хуйще',
206+
'хую',
207+
'хуя',
208+
'хуяк',
209+
'хуякать',
210+
'хуярить',
211+
'хуярь',
212+
'хуячить',
213+
'хуёво',
214+
'хуёвый',
215+
'черножопый',
216+
'чурка',
217+
'чурки',
218+
'шалава',
219+
'шлюха',
220+
'шлюшка',
221+
];

src/Support/RussianNormalizer.php

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace JonPurvis\Profanify\Support;
6+
7+
final class RussianNormalizer
8+
{
9+
public static function normalizeRussianText(string $text): string
10+
{
11+
$text = mb_strtolower(str_replace('ё', 'е', $text), 'UTF-8');
12+
13+
$text = strtr($text, [
14+
'@' => 'а', '0' => 'о', '1' => 'и', '3' => 'з', '4' => 'ч', '6' => 'б',
15+
'a' => 'а', 'c' => 'с', 'e' => 'е', 'o' => 'о', 'p' => 'р', 'x' => 'х', 'y' => 'й', 'k' => 'к',
16+
'b' => 'б', 'd' => 'д', 'g' => 'г', 'h' => 'н', 'm' => 'м', 't' => 'т', 'v' => 'в', 'i' => 'и',
17+
'|' => 'л', '!' => 'и', '_' => '', '-' => '', '*' => '', '.' => '', ',' => '',
18+
]);
19+
20+
return preg_replace('/[^а-я]+/u', '', $text) ?: '';
21+
}
22+
23+
/**
24+
* @return array<int, string>|null
25+
*/
26+
public static function filterRussianProfanity(string $text): ?array
27+
{
28+
/** @var array<int, string> $profanities */
29+
$profanities = include __DIR__.'/../Config/profanities/ru.php';
30+
31+
$normalized = self::normalizeRussianText($text);
32+
$found = [];
33+
34+
foreach ($profanities as $bad) {
35+
if ($bad !== '' && str_contains($normalized, (string) $bad)) {
36+
$found[] = $bad;
37+
}
38+
}
39+
40+
return $found !== [] ? $found : null;
41+
}
42+
43+
public static function assertNoRussianProfanity(string $filePath): void
44+
{
45+
$lines = file($filePath, FILE_IGNORE_NEW_LINES) ?: [];
46+
/** @var array<int, string> $badWords */
47+
$badWords = include __DIR__.'/../Config/profanities/ru.php';
48+
49+
$offended = [];
50+
51+
foreach ($lines as $num => $line) {
52+
$norm = self::normalizeRussianText($line);
53+
54+
foreach ($badWords as $bad) {
55+
if ($bad !== '' && str_contains($norm, (string) $bad)) {
56+
$offended[] = $num + 1;
57+
break;
58+
}
59+
}
60+
}
61+
62+
if ($offended !== []) {
63+
throw new \Exception(
64+
sprintf('Profanity in %s, lines: %s', $filePath, implode(', ', $offended)),
65+
);
66+
}
67+
}
68+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Tests\Fixtures;
6+
7+
class HasExplicitRussianProfanity
8+
{
9+
public string $bad = 'Это полная хуйня!';
10+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Tests\Fixtures;
6+
7+
class HasMaskedRussianProfanity
8+
{
9+
public string $masked = 'Ну и п@зда же ты, x*y!';
10+
}

0 commit comments

Comments
 (0)