autowp/filters

View on GitHub
src/Filename/Safe.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php

namespace Autowp\Filter\Filename;

use Zend\Filter\FilterInterface;
use Autowp\Filter\Transliteration;

class Safe implements FilterInterface
{
    private $replaces = array (
        "№" => "N",
        " " => '_',
        '"' => '_',
        "/" => '_',
        '*' => '_',
        '`' => '_',
        '#' => '_',
        '&' => '_',
        '\\' => '_',
        '!' => '_',
        '@' => '_',
        '$' => 's',
        '%' => '_',
        '^' => '_',
        '=' => '-',
        '|' => '_',
        '?' => '_',
        '„' => ',',
        '“' => '_',
        '”' => '_',
        '{' => '(',
        '}' => ')',
        ':' => '-',
        ';' => '_',
        '-' => '-',
    );

    /**
     * Defined by FilterInterface
     *
     * @param  string $value
     * @return string
     */
    public function filter($value)
    {
        $transliteration = new Transliteration();

        $value = $transliteration->filter($value);
        $value = mb_strtolower($value);

        $value = strtr($value, $this->replaces);

        $value = trim($value, '_-');

        $value = preg_replace('|[^A-Za-z0-9.(){}_-]|isu', '_', $value);

        do {
            $oldLength = strlen($value);
            $value = str_replace('__', '_', $value);
        } while ($oldLength != strlen($value));

        if (strlen($value) == 0) {
            $value = '_';
        }

        switch ($value) {
            case '..': $value = '__'; break;
            case '.':  $value = '_'; break;
        }

        return $value;
    }

}