Skip to content

Commit ca8bb4d

Browse files
committed
Add streamline email filter
1 parent 3a75369 commit ca8bb4d

6 files changed

+55
-4
lines changed

src/Filter/NormalizeToAlphanumericFilter.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
*/
1616
class NormalizeToAlphanumericFilter implements StringFilterInterface
1717
{
18-
private StringFilterRunner $filterRunner;
18+
private StringFilterInterface $filterRunner;
1919

2020
public function __construct()
2121
{

src/Filter/NormalizeToAlphanumericLowercaseFilter.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
*/
1717
class NormalizeToAlphanumericLowercaseFilter implements StringFilterInterface
1818
{
19-
private StringFilterRunner $filterRunner;
19+
private StringFilterInterface $filterRunner;
2020

2121
public function __construct()
2222
{

src/Filter/StreamlineEmailFilter.php

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<?php
2+
3+
namespace Squirrel\Strings\Filter;
4+
5+
use Squirrel\Strings\StringFilterInterface;
6+
7+
/**
8+
* Streamline email format, converting domain part to lowercase and keeping the username part case-sensitive
9+
*/
10+
class StreamlineEmailFilter implements StringFilterInterface
11+
{
12+
public function filter(string $string): string
13+
{
14+
if (\strpos($string, '@') === false) {
15+
return $string;
16+
}
17+
18+
// Split up email in username and domain part
19+
$emailParts = \explode('@', $string);
20+
21+
// The first part is always the username part
22+
$username = \array_shift($emailParts);
23+
24+
// All the other parts are the domain part
25+
$domain = \implode('@', $emailParts);
26+
27+
$lowercaseFilter = new LowercaseFilter();
28+
29+
// Only lowercase the domain part, username can be case sensitive
30+
return $username . '@' . $lowercaseFilter->filter($domain);
31+
}
32+
}

src/Filter/StreamlineInputNoNewlinesFilter.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
*/
1111
class StreamlineInputNoNewlinesFilter implements StringFilterInterface
1212
{
13-
private StringFilterRunner $filterRunner;
13+
private StringFilterInterface $filterRunner;
1414

1515
public function __construct()
1616
{

src/Filter/StreamlineInputWithNewlinesFilter.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
class StreamlineInputWithNewlinesFilter implements StringFilterInterface
99
{
10-
private StringFilterRunner $filterRunner;
10+
private StringFilterInterface $filterRunner;
1111

1212
public function __construct()
1313
{

tests/StringFilterTest.php

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
use Squirrel\Strings\Filter\ReplaceUnicodeWhitespacesFilter;
2828
use Squirrel\Strings\Filter\ReplaceUnixStyleNewlinesWithParagraphsAndBreaksFilter;
2929
use Squirrel\Strings\Filter\SnakeCaseToCamelCaseFilter;
30+
use Squirrel\Strings\Filter\StreamlineEmailFilter;
3031
use Squirrel\Strings\Filter\StreamlineInputNoNewlinesFilter;
3132
use Squirrel\Strings\Filter\StreamlineInputWithNewlinesFilter;
3233
use Squirrel\Strings\Filter\TrimFilter;
@@ -374,4 +375,22 @@ public function testRemoveHTMLCharacters()
374375
{
375376
$this->assertEquals(" &amp; haha strongmany/strong \xc2\xa0 &nbsp; grüss götter \r\n\n\n\t \n \n invalidl'etat\\ thing contained!!!&trade; ", (new RemoveHTMLTagCharacters())->filter($this->testString));
376377
}
378+
379+
public function testEmailStreamline()
380+
{
381+
$emails = [
382+
'bademail' => 'bademail',
383+
'BADEMAIL' => 'BADEMAIL',
384+
385+
386+
387+
388+
];
389+
390+
$emailFilter = new StreamlineEmailFilter();
391+
392+
foreach ($emails as $input => $expectedOutput) {
393+
$this->assertSame($expectedOutput, $emailFilter->filter($input));
394+
}
395+
}
377396
}

0 commit comments

Comments
 (0)