使用regex替换name元素

时间:2012-12-11 00:08:50

标签: php regex

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

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

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

return $fixedOutput;

如何解决此问题?

1 个答案:

答案 0 :(得分:1)

你可以尝试使用str_replace函数中的build来实现你想要的东西(假设没有像“test [test [key]]”那样嵌套的bra :::

$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]" />

并解析你可以做的名字属性:

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 "";
}

OR

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

    return "";
}