diff --git a/src/QrCode/QrCode.php b/src/QrCode/QrCode.php index 95fa584..af0569d 100644 --- a/src/QrCode/QrCode.php +++ b/src/QrCode/QrCode.php @@ -45,6 +45,8 @@ public static function create(string $data, string $fileFormat = null): self private function __construct(string $data, string $fileFormat) { + $data = $this->cleanUnsupportedCharacters($data); + if (class_exists(ErrorCorrectionLevel\ErrorCorrectionLevelMedium::class)) { // Endroid 4.x $this->qrCode = BaseQrCode::create($data) @@ -127,6 +129,13 @@ public function avoidCompactSvgs(): void } } + private function cleanUnsupportedCharacters(string $data): string + { + $pattern = '/([^a-zA-Z0-9.,;:\'"+\-\/()?*\[\]{}|`´~ !^#%&<>÷=@_$£àáâäçèéêëìíîïñòóôöùúûüýßÀÁÂÄÇÈÉÊËÌÍÎÏÒÓÔÖÙÚÛÜÑ\\n])/u'; + + return preg_replace($pattern, '', $data); + } + private function setWriterByExtension(string $extension): void { if (!in_array($extension, self::SUPPORTED_FILE_FORMATS)) { diff --git a/tests/QrCode/QrCodeTest.php b/tests/QrCode/QrCodeTest.php index d3c855d..dd54a32 100644 --- a/tests/QrCode/QrCodeTest.php +++ b/tests/QrCode/QrCodeTest.php @@ -118,4 +118,31 @@ public function stringProvider() ] ]; } + + /** + * @dataProvider invalidCharactersCodeProvider + */ + public function testItRemovesInvalidCharacters(string $providedString, string $expectedString): void + { + $qrCode = QrCode::create($providedString); + + $this->assertEquals( + $expectedString, + $qrCode->getText() + ); + } + + public function invalidCharactersCodeProvider(): array + { + return [ + 'keepAllAllowedCharacters' => [ + 'providedString' => 'a-zA-Z0-9.,;:\'+-/()?*[]{}|`´~!"#%&<>÷=@_$£^àáâäçèéêëìíîïñòóôöùúûüýßÀÁÂÄÇÈÉÊËÌÍÎÏÒÓÔÖÙÚÛÜÑ', + 'expectedString' => 'a-zA-Z0-9.,;:\'+-/()?*[]{}|`´~!"#%&<>÷=@_$£^àáâäçèéêëìíîïñòóôöùúûüýßÀÁÂÄÇÈÉÊËÌÍÎÏÒÓÔÖÙÚÛÜÑ' + ], + 'removeUnallowedCharacters' => [ + 'providedString' => '«This is a test!»', + 'expectedString' => 'This is a test!' + ], + ]; + } }