Я делаю анализатор свойств, и я хочу, чтобы он мог анализировать строку любой длины.
Например, я хотел бы иметь возможность сделать следующий вызов:
getDynamicProp("cheese:no;sauce:yes;chicken:brown", "sauce");
и имеют "yes"
вернулся из него.
Вот что у меня так далеко:
function getDynamicProp($string , $property){
$args = func_num_args();
$args_val = func_get_args();
$strlen = mb_strlen($string);$propstrstart = mb_strpos($string , $property . ":");
$propstrend1 = substr($string , $propstrstart , )
$propstrend = mb_strpos($string , ";" , $propstrstart);$finalvalue = substr($string , $propstrstart , $propstrend);
$val = str_replace($property . ":" , "" , $finalvalue);
$val2 = str_replace(";" , "" , $val);
return $val2;
}
Вы можете попробовать это. Функция использует explode для преобразования строк в массивы, которыми легче манипулировать:
function getDynamicProp($string , $property){
$the_result = array();
$the_array = explode(";", $string);
foreach ($the_array as $prop) {
$the_prop = explode(":", $prop);
$the_result[$the_prop[0]] = $the_prop[1];
}
return $the_result[$property];
}
$the_string = "cheese:no;sauce:yes;chicken:brown";
echo getDynamicProp($the_string,"cheese");
echo getDynamicProp($the_string,"sauce");
echo getDynamicProp($the_string,"chicken");
Я думаю, ты усложняешь, или я не понял, чего ты хочешь.
Я пойду с регулярным выражением вместо поиска позиции.
Вот что я буду использовать:
function getDynamicProp($string , $property){
if (preg_match('/(^|;)' . $property . ':(?P<value>[^;]+)/', $string, $matches)) {
return $matches['value'];
}
return false;
}
Проверьте Вот визуализировать регулярное выражение
Вы бы лучше использовать json_encode
а также json_decode
если вы контролируете эту строку. Если нет, это намного проще, как это:
function getDynamicProp($string, $property) {
$string = str_replace(array(':',';'), array('=','&'), $string);
parse_str($string, $result);
return $result[$property];
}
Или хранить их как cheese=no&sauce=yes&chicken=brown
, Тогда еще проще.