Php 高级正则表达式替换。检查是否在<;脚本>;标签

Php 高级正则表达式替换。检查是否在<;脚本>;标签,php,regex,preg-match,preg-match-all,Php,Regex,Preg Match,Preg Match All,我有一个简单的正则表达式,它检查整个字符串中的函数声明。所以在这段代码中: public function Test($name) { echo 'In test'; } 它将找到第一部分: function Test($name) { 它用一件定制的衣服取代了它: function Test($name) { echo 'New piece'; 这最终使我的代码看起来像这样: public function Test($name) { echo 'New piec

我有一个简单的正则表达式,它检查整个字符串中的函数声明。所以在这段代码中:

public function Test($name)
{
    echo 'In test';
}
它将找到第一部分:

function Test($name)
{
它用一件定制的衣服取代了它:

function Test($name)
{
    echo 'New piece';
这最终使我的代码看起来像这样:

public function Test($name)
{
    echo 'New piece';
    echo 'In test';
}
这一切都与此正则表达式完美结合:

preg_match_all ( '/function(.*?)\{/s', $source, $matches )

问题是,当正则表达式看到脚本标记时,我想忽略所有内容。所以在这种情况下,这个来源:

public function Test($name) //<--- Match found!
{
    echo 'In test';
}

<script type="text/javascript"> //<--- Script tag found, dont do any matches!
$(function() {
    function Test()
    {
        var bla = "In js";
    }
});
</script> //<--- Closed tag, start searching for matches again.

public function Test($name) //<--- Match found!
{
    echo 'In test';
}

公共功能测试($name)/,如注释中所述:

如果您的php函数总是有一个可见性修饰符,如
public
,您可以执行以下操作:

(?:public|protected|private)\s+function\s+\w+\(.*?\)\s*\{
否则,可以先剥离脚本部分。 比如:

$text = preg_replace('/<script(?:(?!<\/script>).)*<\/script>/s','',$text);

$text=preg_replace('/我不懂python,但我懂正则表达式:

您原来的正则表达式不太好,因为它匹配

// This is a functional comment { isn't it? }
             ^^^^^^^^...........^
也许,如果您让它更健壮,它将解决您的问题:

^\s*(公共|受保护|私有)\s+函数\s+\(.*?\).*{


这将确保它在99%的情况下都是一个函数声明。仍然有一些不寻常的情况可以愚弄它。

再多的正则表达式也无法实现一个像样的防故障解决方案

正确的方法是使用



//这太复杂了。仅用一个
preg\u match\u all()无法完成
。首先提取所有js数据,然后运行脚本,然后再次附加脚本数据。@RohitKumarChoudhary这实际上也是一个很好的解决方案。你能给出一个真实的答案吗?如果没有其他人提出更好的建议,我可能会接受。@Vivendi根据你问题的复杂性,很难给出正确的解决方案注意一点。我也必须研究一下:)如果你只是将代码注入javascript,更合适的选择是挂接你正在修改的函数。请注意,这只适用于有效的php/html输入(即:代码必须从
<?php

$code = <<<END
<?php 
public function Test(\$name) //<--- Match found!
{
    echo 'In test';
}
?>
<script type="text/javascript"> //<--- Script tag found, dont do any matches!
$(function() {
    function Test()
    {
        var bla = "In js";
    }
});
</script> //<--- Closed tag, start searching for matches again.
<? 
public function Bla(\$name) //<--- Match found!
{
    echo 'In test';
}
END;


function injectCodeAtFunctionsStart ($originalCode, $code)
{
    $tokens = token_get_all ($originalCode);

    $newTokenTree = '';

    // iterate tokens
    for ($i = 0, $total = count($tokens); $i < $total; $i++) 
    {
        $node = $tokens[$i];
        $newTokenTree[] = $node;

        if (is_array ($node)) 
        {
            // function start
            if ($node[0] == T_FUNCTION) 
            {
                // walk to first brace
                while ($tokens[$i] !== '{') {
                    $newTokenTree[] = $tokens[$i];
                    $i++;
                }
                $i++;

                // keep space
                $space = $tokens[$i];
                $newTokenTree[] = $space;

                // add new piece
                $newTokenTree[] = $code;
                $newTokenTree[] = $space;
            }
        }
    }

    // rebuild code from tokens    
    $content = '';
    foreach ($newTokenTree as $node) {
        $content .= is_scalar ($node) ? $node : $node[1];
    }

    return $content;
}


echo injectCodeAtFunctionsStart ($code, 'echo "new piece";');