From 0792438a83bf706818f41c33e31a8d2c1ca9f210 Mon Sep 17 00:00:00 2001 From: Joshua Ramon Enslin Date: Thu, 12 Feb 2026 14:08:10 +0100 Subject: [PATCH] Accept iconclass names with specifying brackets --- src/enums/MDNodaRepository.php | 25 ++++++++++++------------- tests/MDNodaRepositoryTest.php | 2 ++ 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/enums/MDNodaRepository.php b/src/enums/MDNodaRepository.php index b3673ec..08884c0 100644 --- a/src/enums/MDNodaRepository.php +++ b/src/enums/MDNodaRepository.php @@ -399,26 +399,25 @@ enum MDNodaRepository implements MDValueEnumInterface, JsonSerializable { */ private static function validateIconclassId(string $id):string|false { - if (filter_var($id, FILTER_VALIDATE_URL) !== false) { - $id = rtrim(strtr($id, [ - 'http://iconclass.org/rkd/' => '', - 'http://iconclass.org/' => '', - 'https://iconclass.org/' => '', - 'http://www.iconclass.org/rkd/' => '', - 'http://www.iconclass.org/' => '', - 'https://www.iconclass.org/' => '', - ]), '/'); - } - $id = trim($id, "/"); + $id = trim(strtr($id, [ + 'http://iconclass.org/rkd/' => '', + 'http://iconclass.org/' => '', + 'https://iconclass.org/' => '', + 'http://www.iconclass.org/rkd/' => '', + 'http://www.iconclass.org/' => '', + 'https://www.iconclass.org/' => '', + ]), '/'); - if (!empty(trim($id, '0123456789abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ(+)'))) { + if (!empty(trim($id, '0123456789abcdefghijklmnopqrstuvwxyzäüö-/ABCDEFGHIJKLMNOPQRSTUVWXYZÄÜÖ(+)'))) { // Try url_decoding $id = urldecode($id); - if (!empty(trim($id, '0123456789abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ(+)'))) { + if (!empty(trim($id, '0123456789abcdefghijklmnopqrstuvwxyzäüö-/ABCDEFGHIJKLMNOPQRSTUVWXYZÄÜÖ(+)'))) { return false; } } + if (!is_numeric(substr($id, 0, 1))) return false; + return $id; } diff --git a/tests/MDNodaRepositoryTest.php b/tests/MDNodaRepositoryTest.php index b1dce41..7436efa 100644 --- a/tests/MDNodaRepositoryTest.php +++ b/tests/MDNodaRepositoryTest.php @@ -415,6 +415,8 @@ final class MDNodaRepositoryTest extends TestCase { yield "45C221 ; ID" => ["45C221", "45C221"]; yield "45C221(+321) ; ID" => ["45C221(+321)", "45C221(+321)"]; yield "45C221(%2B321) > 45C221(+321) ; ID" => ["45C221(+321)", "45C221(%2B321)"]; + yield "82A(Rattenfanger) ; ID" => ["82A(Rattenfanger)", "http://iconclass.org/rkd/82A(Rattenfanger)"]; + yield "82A(Rattenfänger) ; ID" => ["82A(Rattenfänger)", "http://iconclass.org/rkd/82A(Rattenfänger)"]; yield "Broken input / adfdasjfklasäj%l" => [false, "adfdasjfklasäj%l"]; }