<?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"]'
],
//==========================================================================================================================================================
//==========================================================================================================================================================
];
}
}
?>