多个正则表达式替换(在Aptana Studio 3中),取决于匹配

时间:2013-08-07 10:04:21

标签: regex aptana3

由于mysql_*已被弃用,我想到了一种简单的方法来替换所有已弃用的代码。

这是我的正则表达式;而find是我想要找到的,repl是我想用它取代的。

$__db是我声明的mysqli_connect - 变量

Change MySQL into MySQLi
--
find: mysql_select_db\(([\$"a-zA-Z0-9_]+)\)
repl: \$__db->select_db($1)
--
find: mysql_fetch_object\((\$[a-zA-Z0-9_]+)\)
repl: $1->fetch_object()
--
find: mysql_fetch_array\((\$[a-zA-Z0-9_]+)\)
repl: $1->fetch_array()
--
find: mysql_num_rows\((\$[a-zA-Z0-9_]+)\)
repl: $1->num_rows
--
find: mysql_free_result\((\$[a-zA-Z0-9_]+)\)
repl: 
--
find: mysql_query
repl: \$__db->query
--
find: mysql_error\(\)
repl: mysqli_error\(\)
--
find: ([\$a-zA-Z0-9_]+) = mysql_result\(([\$a-zA-Z0-9_]+), (\d+)\)
repl: \$row = $2->fetch_array();\r\n$1 = \$row[$3]

我的问题是,我可以运行多个正则表达式替换(以便我可以同时替换所有代码)吗?

我知道我可以使用管道|来分隔查找部分,但它如何与替换部分一起使用?

我还没有找到在Aptana Studio 3制作宏的方法。

1 个答案:

答案 0 :(得分:1)

这成了我的解决方案,提供了来自HamZa的提示(谢谢!)

我创建了一个脚本,它遍历选择的目录(在$dir中指定)

我们还可以在$lookFor

的文件中说出我们要查找的内容

我在代码中添加了一些注释,因此您可以按照我的操作进行操作。这不会解决function - db的问题。

因此,如果您有包含数据库连接的类,则必须为函数添加一些内容。

此时此脚本不会更改您的文件(我已对其进行了评论,因此您可以使用“推荐”更改来浏览代码)

而且..我还没有这样做,所以剧本准备陈述。

(这是第二步,这只是修复mysql_*被删除时会中断的事情)

结果将如下所示:(实际上显示我所谈论的缺失功能......我必须将global $__db;添加到每个function

enter image description here

最后!这是代码。

<?
/*IGNORE-MYSQL*/
function startsWith($haystack, $needle)
{
    return strpos($haystack, $needle) === 0;
}
function endsWith($haystack, $needle)
{
    return substr($haystack, -strlen($needle)) == $needle;
}
function doFlush()
{
    @flush();
    @ob_flush();
}

function runMySQLToMySQLi_replace($str, $useBoldShow = false, $replace = true)
{
    $catchVars = '\$"\'a-zA-Z0-9_\.\*\->,\[\] ';
    $regexTests = Array();
    $regexTests['(?:['.$catchVars.']+\s?=\s?)?mysql_connect\((['.$catchVars.']+),\s?(['.$catchVars.']+),\s?(['.$catchVars.']+)\)'] = '\$__db = mysqli_connect($1, $2, $3)';
    $regexTests['mysql_select_db\((['.$catchVars.']+)(?:,\s?['.$catchVars.']+)?\)'] = '\$__db->select_db($1)';
    $regexTests['mysql_query\((['.$catchVars.'\(\)=]+)(?:,\s?['.$catchVars.']+)?\)'] = '\$__db->query($1)';
    $regexTests['mysql_errno\(\)'] = '\$__db->errno';
    $regexTests['mysql_error\(\)'] = '\$__db->error';
    $regexTests['mysql_error\((['.$catchVars.']+)\)'] = '\$__db->error';
    $regexTests['mysql_fetch_object\((['.$catchVars.']+)\)'] = '$1->fetch_object()';
    $regexTests['mysql_fetch_row\((['.$catchVars.']+)\)'] = '$1->fetch_array()';
    $regexTests['mysql_fetch_array\((['.$catchVars.']+)\)'] = '$1->fetch_array()';
    $regexTests['mysql_fetch_assoc\((['.$catchVars.']+)\)'] = '$1->fetch_assoc()';
    $regexTests['mysql_num_rows\((['.$catchVars.']+)\)'] = '$1->num_rows';
    $regexTests['mysql_free_result\((['.$catchVars.']+)\)'] = '$1->free()';
    $regexTests['mysql_insert_id\(\)'] = '\$__db->insert_id';
    $regexTests['(['.$catchVars.']+) = mysql_result\((['.$catchVars.']+), (\d+)\)'] = "\$row = $2->fetch_array(); $1 = \$row[$3]";
    $tmpVal = $str;
    foreach($regexTests as $reg => $rep)
    {
        $match = preg_match("/" . $reg . "/i", $tmpVal);
        if($match)
        {
            if($replace)
                $tmpVal = preg_replace("/" . $reg . "/i", ($useBoldShow ? "[{b}]" : "") . $rep . ($useBoldShow ? "[/{b}]" : ""), $tmpVal);
            else
                $tmpVal = preg_replace("/" . $reg . "/i", ($useBoldShow ? "[{b}]" : "") . "$0" . ($useBoldShow ? "[/{b}]" : ""), $tmpVal);
        }
    }
    return $tmpVal;
}

?>
<html>
    <head>
        <style>
        body { margin: 0; padding: 0; }
        .mysql_found { background-color: mistyrose; padding: 10px; border: 1px solid #c9c9c9; border-radius: 5px; margin: 10px; }
        .no_select {
            -webkit-touch-callout: none;
            -webkit-user-select: none;
            -khtml-user-select: none;
            -moz-user-select: moz-none;
            -ms-user-select: none;
            user-select: none; 
            display: inline-block;
        }
        </style>
    </head>
    <body>
<pre><?
    // Directory to search in
    $dir = "/dir/to/search/in/";
    $objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir), RecursiveIteratorIterator::SELF_FIRST);

    // What we are looking for in all files
    $lookFor = "mysql_";
    foreach($objects as $name => $object)
    {
        // Ensure that it is PHP-files we're going through
        if(endsWith($object->getFilename(), '.php')) 
        {
            // Get all contents
            $contents = file_get_contents($object->getPathname());
            // Split it into rows
            $rowSplit = preg_split('/$\R?^/m', $contents);

            // Check the contents for $lookFor
            if(strpos($contents, $lookFor) > 0 && strpos($contents, "/*IGNORE-MYSQL*/") === false)
            {
                echo "<div class=\"mysql_found\">\"" . $lookFor . "\" found in: " . $object->getPathname() . "\n";
                echo "<hr noshade=\"noshade\" />\n";
                echo "Source code:\n";
                $lCount = 1;
                foreach($rowSplit as $row)
                {
                    echo "<div class=\"no_select\" unselectable=\"on\">" . str_pad($lCount++, strlen(count($rowSplit)), " ", STR_PAD_LEFT) . ": </div>" . str_replace(Array("[{b}]", "[/{b}]"), Array("<b style=\"background-color: #cfaaaa;\">", "</b>"), htmlentities(runMySQLToMySQLi_replace($row, true, false))) . "\n";
                }
                echo "\n\n";

                $lCount = 1;
                echo "Fixed code:<br /><br />";
                $doneCode = "";
                foreach($rowSplit as $row)
                {
                    echo "<div class=\"no_select\" unselectable=\"on\">" . str_pad($lCount++, strlen(count($rowSplit)), " ", STR_PAD_LEFT) . ": </div>" . str_replace(Array("[{b}]", "[/{b}]"), Array("<b style=\"background-color: #cfaaaa;\">", "</b>"), htmlentities(runMySQLToMySQLi_replace($row, true))) . "\n";
                    // This is the code that actually does the replacing.
                    $doneCode .= runMySQLToMySQLi_replace($row) . "\n";
                }
                // This is commented out, since I want to make sure it works before I accept some changes.
                // I actually tried it on 3 files without problems.
                //if(isset($_GET['Accepted']))
                //  file_put_contents($object->getPathname(), $doneCode);
                echo "</div>";
            }

        }
        doFlush();
    }
?></pre>
</body>
</html>

如果您想问我一些有关此代码的信息,请执行此操作。 :)