Перед тем, как разбить строку на точки, проверьте, является ли последний символ круглой скобкой. Если это так, этот вызов является функцией.
<?php
$string = str_replace('`', '', $string)
$function = "";
if (substr($string,-1) == ")") {
// Strip off function call first
$opening = strpos($string, "(");
$function = substr($string, 0, $opening+1);
$string = substr($string, $opening+1, -1);
}
// Do your existing parsing to $string
if ($function == "") {
// Put function back on string
$string = $function . $string . ")";
}
?>
Если вам нужно охватить более сложные ситуации, такие как использование вложенных функций или несколько последовательных функций в одной переменной "$ string", это станет гораздо более сложной функцией, и вам лучше спросить себя, почему эти элементы Во-первых, неправильно отмечены и не нуждаются в дальнейшем разборе.
РЕДАКТИРОВАТЬ: Обновление для вложенных функций, в соответствии с исходной записи редактирования
Чтобы вышеуказанная функция работала с несколькими вложенными функциями, вам, вероятно, понадобится что-то, что «развернет» ваши вложенные функции. Я не проверял это, но следующая функция может привести вас на правильный путь.
<?php
function unwrap($str) {
$pos = strpos($str, "(");
if ($pos === false) return $str; // There's no function call here
$last_close = 0;
$cur_offset = 0; // Start at the beginning
while ($cur_offset <= strlen($str)) {
$first_close = strpos($str, ")", $offset); // Find first deep function
$pos = strrpos($str, "(", $first_close-1); // Find associated opening
if ($pos > $last_close) {
// This function is entirely after the previous function
$ticked = Tick(substr($str, $pos+1, $first_close-$pos)); // Tick the string inside
$str = substr($str, 0, $pos)."{".$ticked."}".substr($str,$first_close); // Replace parenthesis by curly braces temporarily
$first_close += strlen($ticked)-($first_close-$pos); // Shift parenthesis location due to new ticks being added
} else {
// This function wraps other functions; don't tick it
$str = substr($str, 0, $pos)."{".substr($str,$pos+1, $first_close-$pos)."}".substr($str,$first_close);
}
$last_close = $first_close;
$offset = $first_close+1;
}
// Replace the curly braces with parenthesis again
$str = str_replace(array("{","}"), array("(",")"), $str);
}