Если у меня есть такая строка,
$my_string="array('red','blue')";
Как я могу преобразовать это в реальный массив?
Пример. :
$my_array=array('red','blue');
НЕ ИСПОЛЬЗОВАТЬ EVAL
, Это ужасное излишество и, вероятно, крайне небезопасное.
Пока это не ЛУЧШИЙ способ сделать это (как упоминалось в комментариях к вопросу), вы можете использовать эту функцию ниже, чтобы сделать именно то, что вам нужно.
Как это устроено:
Он использует Regex, чтобы найти и разбить строку на основе этих макетов, массив разделяется с помощью preg_split
который является регулярным выражением более популярного explode
,
После разделения массив будет иметь несколько пустых значений, поэтому просто используйте array_filter
удалить эти пустые значения.
так:
// Explode string based on regex detection of:
//
// (^\h*[a-z]*\h*\(\h*')
// 1) a-z text with spaces around it and then an opening bracket
// ^ denotes the start of the string
// | denotes a regex OR operator.
// \h denotes whitespace, * denotes zero or more times.
//
// ('\h*,\h*')
// 2) or on '),(' with possible spaces around it
//
// ('\h*\)\h*$)
// 3) or on the final trailing '), again with possible spaces.
// $ denotes the end of the string
// the /i denotes case insensitive.
function makeArray($string){
$stringParts = preg_split("/(^\h*[a-z]*\h*\(\h*')|('\h*,\h*')|('\h*\)\h*$)/i",$string);
// now remove empty array values.
$stringParts = array_filter($stringParts);
return $stringParts;
}
Использование:
//input
$myString = " array('red','blue')";
//action
$array = makeArray($myString);
//output
print_r($array);
Выход:
Array (
[1] => красный
[2] => синий
)
Пример 2:
$myString = " array('red','blue','horses', 'crabs (apples)', '(trapdoor)', '<strong>works</strong>', '436')";
$array = makeArray($myString);
print_r($array);
Выход:
Array (
[1] => красный
[2] => синий
[3] => лошади
[4] => крабы (яблоки)
[5] => (люк)
[6] =><strong>works</strong>
[7] => 436
)
Очевидно, регулярное выражение может нужна небольшая настройка в зависимости от ваших конкретных обстоятельств, но это очень хорошая отправная точка …
Других решений пока нет …