#php #regex #preg-split
#php #регулярное выражение #предварительный раздел
Вопрос:
Я работаю над CMS и ищу способ преобразовать список аргументов функции в массив. Например:
function testfunction($param1, $param2){
$string = "Param1: $param1 Param2: $param2";
return $string;
}
$funcname = 'testfunction';
$params = "'this is, parameter 1', 'this is parameter2'";
//This doesnt work, sends both parameters as the first, dont know why.
echo call_user_func($funcname, $params);
//So I want to split the parameter list:
$paramsarray = preg_split('%Complex Regex%', $params);
//And call thusly:
echo call_user_func_array($funcname, $paramsarray);
Я не знаю, какое регулярное выражение здесь использовать….
Я мог бы просто разнести по ‘,’ но это разнесло бы все запятые, содержащиеся в строках, массивах и т.д… Итак, для этого мне нужно регулярное выражение, я согласен с регулярными выражениями, но, похоже, в этом было бы много правил.
Комментарии:
1. Хорошо, я знаю о call_user_func_array, этот пример очень упрощен. Имя функции и все параметры являются динамическими и изначально не вводятся как массив. Вот почему я должен разделить их на массив. Я не знаю, почему call_user_func не будет работать у меня с несколькими аргументами?
Ответ №1:
Я думаю, если вы действительно хотите начать со строки (вместо массива, как предлагали другие), вы могли бы сделать:
В PHP 5.3:
$params = "'this is, parameter 1', 'this is parameter2'";
$paramsarray = str_getcsv($params, ',', "'");
В PHP 5.1/5.2:
$fp = fopen('php://temp', 'w ');
fwrite($fp, $params);
fseek($fp, 0);
$paramsarray = fgetcsv($fp, 0, ',', "'");
print_r($paramsarray);
…и получаем:
Array
(
[0] => this is, parameter 1
[1] => this is parameter2
)
…затем используйте call_user_func_array
.
Если вы хотите использовать более сложные типы (например: массивы или объекты), это будет настоящей проблемой. Вероятно, вам придется использовать токенизатор.
Комментарии:
1. Спасибо! Пока это работает, я даже не знал о функциях токенизатора… Мне нужно будет изучить это дальше. для параметров типа: testfunction(‘это param1’, array(‘one’ => ‘something’, ‘two’ => ‘что-то еще’), ‘и еще больше’, $someclass-> somefunction(‘дополнительные параметры’));
Ответ №2:
Может быть, вы могли бы просто использовать func_get_args для этого?
Кроме того, call_user_func, я считаю, должен вызываться следующим образом:
call_user_func('functionName', $param1, $param2);
Ответ №3:
$params
является ли (в вашем случае) единственной переменной, которая содержит единственное значение типа string
. Это не массив или какой-либо другой сложный тип. Я предполагаю, что вам даже не нужен ваш %Complex Regex%
.
$funcname = 'testfunction';
$params = "'this is, parameter 1', 'this is parameter2'";
foreach ($params as amp;$param) $param = trim($param, "' nrt");
echo call_user_func_array($funcname, $params);
Комментарии:
1. Да, однако это всего лишь очень простой пример. В какой-то момент я могу определить массивы. Так что это создает проблему… Все еще не уверен, как поступить в этом случае.
2. Если у вас уже есть массив, вы можете просто опустить
explode()
вещь, потому что это просто разбивает строку на массив. Интересная вещьcall_user_func_array()
.
Ответ №4:
Звучит так, будто вместо этого вы хотите вызвать_user_func_array.
$params = array('this is, parameter 1', 'this is parameter2');
$funcname = 'testfunction';
echo call_user_func_array($funcname, $params);
Ответ №5:
Попробуйте, возможно, использовать call_user_func_array
вместо этого.