0

我试图在变量的名称属性中用这个“iwdnowfreedom_body_style_var”替换这个“iwdnowfreedom [body_style] [var]”。可能有几个数组键,但就我的情况而言,将它们剥离应该不会导致任何问题。

这是我到目前为止的代码:

$pattern = '/name\\s*=\\s*["\'](.*?)["\']/i';
$replacement = 'name="$2"';
$fixedOutput = preg_replace($pattern, $replacement, $input);

return $fixedOutput;

我该如何解决这个问题才能正常工作?

4

1 回答 1

1

您可以尝试使用 str_replace 函数中的构建来实现您正在寻找的内容(假设没有像“test [test [key]]”这样的嵌套括号):

$str = "iwdnowfreedom[body_style][var]";
echo trim( str_replace(array("][", "[", "]"), "_", $str), "_" );

或者如果您更喜欢正则表达式(嵌套括号可以很好地使用此方法):

$input = "iwdnowfreedom[body_style][var]";
$pattern = '/(\[+\]+|\]+\[+|\[+|\]+)/i';
$replacement = '_';
$fixedOutput = trim( preg_replace($pattern, $replacement, $input), "_" );

echo $fixedOutput;

我认为您还意味着您可能有一个字符串,例如

<input id="blah" name="test[hello]" />

并解析 name 属性,您可以这样做:

function parseNameAttribute($str)
{
    $pos = strpos($str, 'name="');

    if ($pos !== false)
    {
        $pos += 6; // move 6 characters forward to remove the 'name="' part

        $endPos = strpos($str, '"', $pos); // find the next quote after the name="

        if ($endPos !== false)
        {
            $name = substr($str, $pos, $endPos - $pos); // cut between name=" and the following "

            return trim(preg_replace('/(\[+\]+|\]+\[+|\[+|\]+)/i', '_', $name), '_');
        }
    }

    return "";
}

或者

function parseNameAttribute($str)
{
    if (preg_match('/name="(.+?)"/', $str, $matches))
    {
        return trim(preg_replace('/(\[+\]+|\]+\[+|\[+|\]+)/i', '_', $matches[1]), '_');
    }

    return "";
}
于 2012-12-11T00:13:11.147 回答