C ++编辑一个php文件,保持格式化

时间:2016-01-15 13:48:16

标签: php c++ editing

我有一个可识别人物的C ++脚本,因此它可以识别脸部,也可以识别属于该脸部的人物。我是一个非常C ++的新手,所以我很高兴我可以让它工作(原始脚本不是我写的,但需要一些改变才能工作)。

这个脚本中有一个函数,当它识别出例如我时,它需要改变一个php文件。

我已经编写了这个函数,但它完全破坏了php文件的格式并删除了我不想删除的代码片段。

查找php文件并编辑它的C ++代码:

if(nWho==P_NICK)
{   
    fstream calendar("/var/www/html/MagicMirror_Old/calendar.php");
    string readout;
    string search;
    search = "$url = 'some_URL_to_some_site'";
    string replace;
    replace = "$url = 'some_URL_to_some_other_site'"
    while(getline(calendar,readout))
    {
      if(readout == search)
      {
        calendar << replace;
      }
      else 
      {
        calendar << readout;
      }
    }   
}

现在正在编辑的原始php文件在编辑之前具有以下内容:

// Set the url of the calendar feed.
$url = 'some_URL_to_some_site';

/*****************************************/

// Run the helper function with the desired URL and echo the contents.
echo get_url($url);

// Define the helper function that retrieved the data and decodes the content.
function get_url($url)
{
    //user agent is very necessary, otherwise some websites like google.com wont give zipped content
    $opts = array(
        'http'=>array(
            'method'=>"GET",
            'header'=>"Accept-Language: en-US,en;q=0.8rn" .
                        "Accept-Encoding: gzip,deflate,sdchrn" .
                        "Accept-Charset:UTF-8,*;q=0.5rn" .
                        "User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:19.0) Gecko/20100101 Firefox/19.0 FirePHP/0.4rn",
            "ignore_errors" => true  //Fix problems getting data
        ),
        //Fixes problems in ssl 
    "ssl" => array(
        "verify_peer"=>false,
        "verify_peer_name"=>false
    )
    );

    $context = stream_context_create($opts);
    $content = file_get_contents($url ,false,$context); 

    //If http response header mentions that content is gzipped, then uncompress it
    foreach($http_response_header as $c => $h)
    {
        if(stristr($h, 'content-encoding') and stristr($h, 'gzip'))
        {
            //Now lets uncompress the compressed data
            $content = gzinflate( substr($content,10,-8) );
        }
    }

    return $content;
}

在C ++编辑文件后,会转到以下内容:

<?php
<?php Set the url of the calendar feed.
 Set the url of the calendar feed.= 'https://p01-calendarws.icloud.com/ca/subscribe/1/n6x7Farxpt7m9S8bHg1TGArSj7J6kanm_2KEoJPL5YIAk3y70FpRo4GyWwO-6QfHSY5mXtHcRGVxYZUf7U3HPDOTG5x0qYnno1Zr_VuKH2M';
= 'https://p01-calendarws.icloud.com/ca/subscribe/1/n6x7Farxpt7m9S8bHg1TGArSj7J6kanm_2KEoJPL5YIAk3y70FpRo4GyWwO-6QfHSY5mXtHcRGVxYZUf7U3HPDOTG5x0qYnno1Zr_VuKH2M';***********/
***********/ helper function with the desired URL and echo the contents.
 helper function with the desired URL and echo the contents.trieved the data and decodes the content.
trieved the data and decodes the content.ent is very necessary, otherwise some websites like google.com wont give zipped content
ent is very necessary, otherwise some websites like google.com wont give zipped content'header'=>"Accept-Language: en-US,en;q=0.8rn" .
'header'=>"Accept-Language: en-US,en;q=0.8rn" .,deflate,sdchrn" .
,deflate,sdchrn" .       "Accept-Charset:UTF-8,*;q=0.5rn" .
       "Accept-Charset:UTF-8,*;q=0.5rn" .illa/5.0 (X11; Linux x86_64; rv:19.0) Gecko/20100101 Firefox/19.0 FirePHP/0.4rn",
illa/5.0 (X11; Linux x86_64; rv:19.0) Gecko/20100101 Firefox/19.0 FirePHP/0.4rn",ixes problems in ssl 
ixes problems in ssl "verify_peer"=>false,
"verify_peer"=>false,=>false
=>false  );
  );    $context = stream_context_create($opts);
    $context = stream_context_create($opts);e,$context); 
e,$context); /If http response header mentions that content is gzipped, then uncompress it
/If http response header mentions that content is gzipped, then uncompress it, 'content-encoding') and stristr($h, 'gzip'))
, 'content-encoding') and stristr($h, 'gzip'))the compressed data
the compressed datant = gzinflate( substr($content,10,-8) );
nt = gzinflate( substr($content,10,-8) );tent;
tent;

正如您可能已经注意到的那样,考虑到原始状态,这不是文件的样子。

基本上只有第二行的$ url需要被不同的url替换,而php文件的其余格式应该保持不变。 有没有办法在C ++中执行此操作?

1 个答案:

答案 0 :(得分:0)

在此SO答案中取代replace()和replaceAll()函数的代码,以替换字符串中的某些文本:

#include <iostream>
#include <fstream>
#include <sstream>

using namespace std;

bool replace(std::string& str, const std::string& from, const std::string& to) {
    size_t start_pos = str.find(from);
    if(start_pos == std::string::npos)
        return false;
    str.replace(start_pos, from.length(), to);
    return true;
}

void replaceAll(std::string& str, const std::string& from, const std::string& to) {
    if(from.empty())
        return;
    size_t start_pos = 0;
    while((start_pos = str.find(from, start_pos)) != std::string::npos) {
        str.replace(start_pos, from.length(), to);
        start_pos += to.length(); // In case 'to' contains 'from', like replacing 'x' with 'yx'
    }
}

int main()
{
    ifstream calendar("calendar.php");
    std::stringstream buffer;
    // read whole file in a buffer
    buffer << calendar.rdbuf();
    // use a new file for output
    ofstream newcalendar;
    newcalendar.open("newcalendar.php");
    string search  = "$url = 'some_URL_to_some_site'";
    string to = "$url = 'some_URL_to_some_other_site'";
    string content = buffer.str();
    replaceAll(content, search, to);
    newcalendar << content;
    newcalendar.close();
    calendar.close();
    remove("calendar.php");
    rename("newcalendar.php", "calendar.php");
    return 0;
}

小心,搜索文本的拼写必须准确!

编辑:添加了两行来重命名文件