From eb158937c3ce44bb94937c16c07ee12962efff0f Mon Sep 17 00:00:00 2001 From: Manuel Reinhard Date: Sun, 23 Jun 2024 20:21:24 +0200 Subject: [PATCH] Remove unallowed characters in qr code --- src/QrCode/QrCode.php | 9 +++++++++ tests/QrCode/QrCodeTest.php | 27 +++++++++++++++++++++++++++ 2 files changed, 36 insertions(+) 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!' + ], + ]; + } }