Parser tagow inputa do tablicy

<?php

/**
 * Class parse data from string - example:
 * [ input value="asdasd" type="text" name="imie" placeholder="" class="" style="" validators="onlyNumbers, min(3), max(128)" items="1|aaa, 2|bbb" ]
 * Result getParseTags() = array:
    [
        'value' => 'asdasd',
        'type' => 'text',
        'name' => 'imie',
        'placeholder' => '',
        'class' => '',
        'style' => '',
        'validators' => [
            'onlyNumbers' => '',
            'min' => '3',
            'max' => '128'
        ],
        'items' => [
            1 => 'aaa',
            2 => 'bbb'
        ]
    ]
 */
class TagRecognizer {

    /**
     * @var string 
     */
    private $string;

    /**
     * 
     * @param string $string
     */
    public function __construct($string) {
        $this->string = $string;
    }

    /**
     * get array tags
     * 
     * @return array
     */
    public function getParseTags() {
        //get all between example="example" ::: (\w+) creates array $result[1]-----------([^"]*) creates array $result[2]
        preg_match_all('@(\w+)="([^"]*)"@', $this->string, $result);
        //new array created from $result[1](key) => $result[2](Value)
        $arrayTags = array_combine($result[1], $result[2]);

        return $this->parseTags($arrayTags);
    }

    /**
     * parse tags array to new array
     * 
     * @param array $arrayTags
     * 
     * @return array
     */
    private function parseTags(array $arrayTags) {

        $parseArrayTags = [];

        foreach ($arrayTags as $key => $value) {
            //items
            if ($key === 'items') {
                $parseArrayTags[$key] = $this->parseItems($value);
                //validators
            } elseif ($key === 'validators') {
                $parseArrayTags[$key] = $this->parseValidators($value);
                //simple tag
            } else {
                $parseArrayTags[$key] = $value;
            }
        }

        return $parseArrayTags;
    }

    /**
     *  parse items in string
     * 
     * @param string $value
     * 
     * @return array
     */
    private function parseItems($value) {
        $arrInfo = explode("#", $value);

        $newArray = [];
        foreach ($arrInfo as $item) {
            $values = explode("|", $item);
            $newArray[trim($values[0])] = $values[1];
        }

        return $newArray;
    }

    /**
     * parse validators in string
     * 
     * @param string $value
     * 
     * @return array
     */
    private function parseValidators($value) {
        $arrInfo = explode(",", $value);
        $newArray = [];
        foreach ($arrInfo as $item) {

            // if item has () in value - $keyValidatorValue is equal text between this brackets
            if (strpos($item, '(') !== false && strpos($item, ')') !== false) {

                preg_match('@\((.*?)\)@', $item, $match);

                $keyValidatorValue = $match[1];
            } else {
                $keyValidatorValue = '';
            }

            //$newArray[$item] - delete bracket with text and trim $item
            $newArray[trim(preg_replace("@\([^)]+\)@", "", $item))] = $keyValidatorValue;
        }

        return $newArray;
    }

}
<?php

namespace MultiStepFormBundle\Tests\TagRecognizer;

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
use MultiStepFormBundle\Domain\Tag\Recognizer\TagRecognizer;

class TagRecognizerTest extends WebTestCase {

    /**
     * 
     * @dataProvider dataProvider
     */
    public function testTagRecognizer($expect, $string) {
        $result = new TagRecognizer($string);
        $result = $result->getParseTags();

        return $this->assertEquals($expect, $result);
    }

    public function dataProvider() {
        return [
            [   
                [
                    'value' => 'asdasd',
                    'type' => 'text',
                    'name' => 'imie',
                    'placeholder' => '',
                    'class' => '',
                    'style' => '',
                    'validators' => [
                        'onlyNumbers' => '',
                        'min' => '3',
                        'max' => '128'
                    ],
                    'items' =>[
                        1 => 'aaa',
                        2 => 'bbb'
                    ]
                ] ,
                '[ input value="asdasd" type="text" name="imie" placeholder="" class="" style="" validators="onlyNumbers, min(3), max(128)" items="1|aaa# 2|bbb"      ]'
            ],
            //==========================================================================================================================================================
            //==========================================================================================================================================================
            [   
                [
                    'value' => '12323435',
                    'type' => 'integer',
                    'name' => 'example name',
                    'placeholder' => 'example placeholder',
                    'class' => 'form-controll'
                ],
                '[ input value="12323435" type="integer" name="example name" placeholder="example placeholder" class="form-controll" ]'
            ],
            //==========================================================================================================================================================
            //==========================================================================================================================================================
            [   
                [
            
                    'type' => 'hidden',
                    'id' => 'container',
                    'placeholder' => 'bummmmmm',
                    'class' => 'form-custom',
                    'validators' => [
                        'example' => '',
                        'email' => '',
                        'phone' => '',
                        'lenght' => '200'
                    ],
                ],
                '[ input type="hidden" id="container"  placeholder="bummmmmm" class="form-custom" validators="example, email, phone, lenght(200)" ]'
            ],
            //==========================================================================================================================================================
            //==========================================================================================================================================================
            [   
                [
                    'type' => 'date',
                    'id' => 'data_container',
                    'placeholder' => '2019-01-01',
                    'class' => 'date-custom',
                    'exampleTag' => 'lorem ipsum',
                    'items' =>[
                        1 => 'one',
                        2 => 'two',
                        3 => 'three'
                    ],
                    'validators' => [
                        'date' => '',
                        'lenght' => '202'
                    ],
                ],
                '[ input type="date" id="data_container"  placeholder="2019-01-01" class="date-custom" exampleTag="lorem ipsum" items="1|one# 2|two# 3|three" validators="date, lenght(202)" ]'
            ],
            //==========================================================================================================================================================
            //==========================================================================================================================================================
            [   
                [
                    'name' => 'example_name_value',
                    'otherTag' => 'example_value', 
                    'id' => 'my-id', 
                    'class' => 'my_amazing_class', 
                    
                ],
                '[input name="example_name_value" otherTag="example_value" id="my-id" class="my_amazing_class"]'
            ],
            //==========================================================================================================================================================
            //==========================================================================================================================================================
            [   
                [
                    'name' => 'example_name_value',
                    'otherTag' => 'example_value', 
                    'id' => 'my-id', 
                    'class' => 'my_amazing_class',
                    'validators' => [
                        'custom_validator' => '',
                        'lenght' => '18',
                        'other_validator' => '',
                        'expectedValue' => '12',
                    ]
                ],
                '[input    name="example_name_value"   otherTag="example_value"   id="my-id"   class="my_amazing_class"   validators="custom_validator, lenght(18), other_validator, expectedValue(12)"]'
            ],
            //==========================================================================================================================================================
            //==========================================================================================================================================================
            [   
                [],
                '[    ]'
            ],
            //==========================================================================================================================================================
            //==========================================================================================================================================================
            [   
                [],
                ''
            ],
            //==========================================================================================================================================================
            //==========================================================================================================================================================
            [   
                [],
                '[input]'
            ],
            //==========================================================================================================================================================
            //==========================================================================================================================================================
            [   
                [
                    'name' => 'example_name_value',
                    'otherTag' => 'example_value', 
                    'id' => 'my-id', 
                    'validators' => [
                        'required' => '',
                    ]                    
                ],
                '[input name="example_name_value" otherTag="example_value" id="my-id" validators="required"]'
            ],
            //==========================================================================================================================================================
            //==========================================================================================================================================================
            
        ];
    }

}

?>
Komentarze wyłączone