NotEmoji.php 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. <?php
  2. /*
  3. * Copyright (c) Alexandre Gomes Gaigalas <alganet@gmail.com>
  4. * SPDX-License-Identifier: MIT
  5. */
  6. declare(strict_types=1);
  7. namespace Respect\Validation\Rules;
  8. use function implode;
  9. use function is_string;
  10. use function preg_match;
  11. /**
  12. * Validates if the input does not contain an emoji.
  13. *
  14. * @author Mazen Touati <mazen_touati@hotmail.com>
  15. */
  16. final class NotEmoji extends AbstractRule
  17. {
  18. private const RANGES = [
  19. '\x{0023}\x{FE0F}\x{20E3}',
  20. '\x{0023}\x{20E3}',
  21. '\x{002A}\x{FE0F}\x{20E3}',
  22. '\x{002A}\x{20E3}',
  23. '\x{0030}\x{FE0F}\x{20E3}',
  24. '\x{0030}\x{20E3}',
  25. '\x{0031}\x{FE0F}\x{20E3}',
  26. '\x{0031}\x{20E3}',
  27. '\x{0032}\x{FE0F}\x{20E3}',
  28. '\x{0032}\x{20E3}',
  29. '\x{0033}\x{FE0F}\x{20E3}',
  30. '\x{0033}\x{20E3}',
  31. '\x{0034}\x{FE0F}\x{20E3}',
  32. '\x{0034}\x{20E3}',
  33. '\x{0035}\x{FE0F}\x{20E3}',
  34. '\x{0035}\x{20E3}',
  35. '\x{0036}\x{FE0F}\x{20E3}',
  36. '\x{0036}\x{20E3}',
  37. '\x{0037}\x{FE0F}\x{20E3}',
  38. '\x{0037}\x{20E3}',
  39. '\x{0038}\x{FE0F}\x{20E3}',
  40. '\x{0038}\x{20E3}',
  41. '\x{0039}\x{FE0F}\x{20E3}',
  42. '\x{0039}\x{20E3}',
  43. '\x{1F004}',
  44. '\x{1F0CF}',
  45. '[\x{1F170}-\x{1F171}]',
  46. '[\x{1F17E}-\x{1F17F}]',
  47. '\x{1F18E}',
  48. '[\x{1F191}-\x{1F19A}]',
  49. '[\x{1F1E6}-\x{1F1FF}]',
  50. '[\x{1F201}-\x{1F202}]',
  51. '\x{1F21A}',
  52. '\x{1F22F}',
  53. '[\x{1F232}-\x{1F23A}]',
  54. '[\x{1F250}-\x{1F251}]',
  55. '[\x{1F300}-\x{1F321}]',
  56. '[\x{1F324}-\x{1F393}]',
  57. '[\x{1F396}-\x{1F397}]',
  58. '[\x{1F399}-\x{1F39B}]',
  59. '[\x{1F39E}-\x{1F3F0}]',
  60. '[\x{1F3F3}-\x{1F3F5}]',
  61. '[\x{1F3F7}-\x{1F4FD}]',
  62. '[\x{1F4FF}-\x{1F53D}]',
  63. '[\x{1F549}-\x{1F54E}]',
  64. '[\x{1F550}-\x{1F567}]',
  65. '[\x{1F56F}-\x{1F570}]',
  66. '[\x{1F573}-\x{1F57A}]',
  67. '\x{1F587}',
  68. '[\x{1F58A}-\x{1F58D}]',
  69. '\x{1F590}',
  70. '[\x{1F595}-\x{1F596}]',
  71. '[\x{1F5A4}-\x{1F5A5}]',
  72. '\x{1F5A8}',
  73. '[\x{1F5B1}-\x{1F5B2}]',
  74. '\x{1F5BC}',
  75. '[\x{1F5C2}-\x{1F5C4}]',
  76. '[\x{1F5D1}-\x{1F5D3}]',
  77. '[\x{1F5DC}-\x{1F5DE}]',
  78. '\x{1F5E1}',
  79. '\x{1F5E3}',
  80. '\x{1F5E8}',
  81. '\x{1F5EF}',
  82. '\x{1F5F3}',
  83. '[\x{1F5FA}-\x{1F64F}]',
  84. '[\x{1F680}-\x{1F6C5}]',
  85. '[\x{1F6CB}-\x{1F6D2}]',
  86. '[\x{1F6E0}-\x{1F6E5}]',
  87. '\x{1F6E9}',
  88. '[\x{1F6EB}-\x{1F6EC}]',
  89. '\x{1F6F0}',
  90. '[\x{1F6F3}-\x{1F6F9}]',
  91. '[\x{1F910}-\x{1F93A}]',
  92. '[\x{1F93C}-\x{1F93E}]',
  93. '[\x{1F940}-\x{1F945}]',
  94. '[\x{1F947}-\x{1F970}]',
  95. '[\x{1F973}-\x{1F976}]',
  96. '\x{1F97A}',
  97. '[\x{1F97C}-\x{1F9A2}]',
  98. '[\x{1F9B0}-\x{1F9B9}]',
  99. '[\x{1F9C0}-\x{1F9C2}]',
  100. '[\x{1F9D0}-\x{1F9FF}]',
  101. '\x{00A9}',
  102. '\x{00AE}',
  103. '\x{203C}',
  104. '\x{2049}',
  105. '\x{2122}',
  106. '\x{2139}',
  107. '[\x{2194}-\x{2199}]',
  108. '[\x{21A9}-\x{21AA}]',
  109. '[\x{231A}-\x{231B}]',
  110. '\x{2328}',
  111. '\x{23CF}',
  112. '[\x{23E9}-\x{23F3}]',
  113. '[\x{23F8}-\x{23FA}]',
  114. '\x{24C2}',
  115. '[\x{25AA}-\x{25AB}]',
  116. '\x{25B6}',
  117. '\x{25C0}',
  118. '[\x{25FB}-\x{25FE}]',
  119. '[\x{2600}-\x{2604}]',
  120. '\x{260E}',
  121. '\x{2611}',
  122. '[\x{2614}-\x{2615}]',
  123. '\x{2618}',
  124. '\x{261D}',
  125. '\x{2620}',
  126. '[\x{2622}-\x{2623}]',
  127. '\x{2626}',
  128. '\x{262A}',
  129. '[\x{262E}-\x{262F}]',
  130. '[\x{2638}-\x{263A}]',
  131. '\x{2640}',
  132. '\x{2642}',
  133. '[\x{2648}-\x{2653}]',
  134. '[\x{265F}-\x{2660}]',
  135. '\x{2663}',
  136. '[\x{2665}-\x{2666}]',
  137. '\x{2668}',
  138. '\x{267B}',
  139. '[\x{267E}-\x{267F}]',
  140. '[\x{2692}-\x{2697}]',
  141. '\x{2699}',
  142. '[\x{269B}-\x{269C}]',
  143. '[\x{26A0}-\x{26A1}]',
  144. '[\x{26AA}-\x{26AB}]',
  145. '[\x{26B0}-\x{26B1}]',
  146. '[\x{26BD}-\x{26BE}]',
  147. '[\x{26C4}-\x{26C5}]',
  148. '\x{26C8}',
  149. '[\x{26CE}-\x{26CF}]',
  150. '\x{26D1}',
  151. '[\x{26D3}-\x{26D4}]',
  152. '\x{26EA}',
  153. '[\x{26F0}-\x{26F5}]',
  154. '[\x{26F7}-\x{26FA}]',
  155. '\x{26FD}',
  156. '\x{2702}',
  157. '\x{2705}',
  158. '[\x{2708}-\x{270D}]',
  159. '\x{270F}',
  160. '\x{2712}',
  161. '\x{2714}',
  162. '\x{2716}',
  163. '\x{271D}',
  164. '\x{2721}',
  165. '\x{2728}',
  166. '[\x{2733}-\x{2734}]',
  167. '\x{2744}',
  168. '\x{2747}',
  169. '\x{26E9}',
  170. '\x{274C}',
  171. '\x{274E}',
  172. '[\x{2753}-\x{2755}]',
  173. '\x{2757}',
  174. '[\x{2763}-\x{2764}]',
  175. '[\x{2795}-\x{2797}]',
  176. '\x{27A1}',
  177. '\x{27B0}',
  178. '\x{27BF}',
  179. '[\x{2934}-\x{2935}]',
  180. '[\x{2B05}-\x{2B07}]',
  181. '[\x{2B1B}-\x{2B1C}]',
  182. '\x{2B50}',
  183. '\x{2B55}',
  184. '\x{3030}',
  185. '\x{303D}',
  186. '\x{3297}',
  187. '\x{3299}',
  188. ];
  189. /**
  190. * {@inheritDoc}
  191. */
  192. public function validate($input): bool
  193. {
  194. if (!is_string($input)) {
  195. return false;
  196. }
  197. return preg_match('/' . implode('|', self::RANGES) . '/mu', $input) === 0;
  198. }
  199. }