理解PHP中的一些代码
我是一个学习Ruby的noob程序员,我决定编写一个SERP检查器。问题是我太笨了,不知道该怎么做,所以我在网上找到了一个脚本,它是用PHP编写的。一位朋友帮助我理解了它的第一部分,在那里他发现剧本有很多问题。然而,由于我的朋友很忙,他不能帮我“破译”剧本的第二部分 在$I=0之前,我都能用Ruby写,现在我被卡住了。我想弄清楚剧本的其余部分是怎么回事。 有这些行,特别是那些让我困惑的行,我想我可以处理其余的行,但是,如果我没有提供足够的信息,我已经把它们全部包括在内了(在底部)理解PHP中的一些代码,php,ruby,Php,Ruby,我是一个学习Ruby的noob程序员,我决定编写一个SERP检查器。问题是我太笨了,不知道该怎么做,所以我在网上找到了一个脚本,它是用PHP编写的。一位朋友帮助我理解了它的第一部分,在那里他发现剧本有很多问题。然而,由于我的朋友很忙,他不能帮我“破译”剧本的第二部分 在$I=0之前,我都能用Ruby写,现在我被卡住了。我想弄清楚剧本的其余部分是怎么回事。 有这些行,特别是那些让我困惑的行,我想我可以处理其余的行,但是,如果我没有提供足够的信息,我已经把它们全部包括在内了(在底部)
$keyword_implode = str_replace(' ','+',$keywords[$i]);
$fetch_url = "http://www.google.com/search?num=50&q=" . $keyword_implode . "&btnG=Search";
ob_start();
include_once($fetch_url);
$page = ob_get_contents();
ob_end_clean();
我在php.net上查找了一些关于str_replace的信息,但没有一个示例与任何示例(对我而言)非常相似,因此我试图找出他试图用what替换什么
以下是整个脚本:
<?php
if ($_POST['url'] != '') {
if (strpos($_POST['keyword'],"\n")) {
$keywords = str_replace("\n",",",$_POST['keyword']);
$keywords = explode(",",$keywords);
} else {
$keywords[0] = $_POST['keyword'];
}
$keyword_input = $_POST['keyword'];
$url = $_POST['url'];
}
$i = 0;
if ($keywords[$i] != '') {
while ($keywords[$i] != '') {
$keyword_implode = str_replace(' ','+',$keywords[$i]);
$fetch_url = "http://www.google.com/search?num=50&q=" . $keyword_implode . "&btnG=Search";
ob_start();
include_once($fetch_url);
$page = ob_get_contents();
ob_end_clean();
$page = str_replace('<b>','',$page);
$page = str_replace('</b>','',$page);
//preg_match('/008000\">(.+)<\/font><nobr>/i', $page, $match);
preg_match_all('/<font color=#008000>(.*)<\/font>/', $page, $match);
$r = 0;
$position = '0';
while ($match[0][$r] != '') {
if ($position == '0') {
if (strpos($match[0][$r],$url)) {
$position = $r+1;
}
}
$r++;
}
$google_position = $position;
$keyword_table .= '
<tr>
<td>' . $keywords[$i] . '</td>
<td>' . $google_position . '</td>
</tr>';
$i++;
}
$keyword_table = '
<table class="result-table" cellspacing="1">
<tr>
<th>Keyword</th>
<th>Google</th>
</tr>' . $keyword_table . '
</table>';
}
?>
以下是我迄今为止用Ruby编写的内容:
require 'sinatra'
require 'rspec'
get '/serp_checker' do
"<form action='/ranked' method='post'>
<label for='keyword'>Keyword</label>
<textarea name='keyword' id='keyword' type='text' /></textarea>
<label for='url'>URL</label>
<input name='url' id='url' type='text' />
<input type='submit' value='Go!' />
</form>"
end
def clean_up_keywords(str)
str.gsub("\n", ",").delete("\r").split(',')
end
def clean_up_list(arr)
arr.reject(&:empty?).each(&:lstrip!)
end
post '/ranked' do
dirty_list = clean_up_keywords(params[:keyword])
clean_list = clean_up_list(dirty_list)
return clean_list.to_s
end
需要“sinatra”
需要“rspec”
获取“/serp\u checker”do
"
关键词
统一资源定位地址
"
结束
def清除关键字(str)
str.gsub(“\n”,“,”)。删除(“\r”)。拆分(“,”)
结束
def清理清单(arr)
arr.reject(&:empty?)每个(&:lstrip!)
结束
发布“/排名”do
脏列表=清理关键字(参数[:关键字])
清理清单=清理清单(脏清单)
将清洁列表返回给
结束
很抱歉这么长时间,我只想描述整个问题,这样我就不会忘记给出有关问题的重要信息。只需查看您在文章顶部指出的代码部分:
- 第一行是用+符号替换数组中该部分中的任何空格
- $fetch_url使用第一行中修改过的字符串构建url
- ob_start激活输出缓冲区,防止任何内容输出到页面
- include_once包含上面构建的URL(如果尚未包含)
- $page=ob_get_contents将输出缓冲区的内容分配给$page变量
- ob_end_clean擦拭输出缓冲区
- 第一行是用+符号替换数组中该部分中的任何空格
- $fetch_url使用第一行中修改过的字符串构建url
- ob_start激活输出缓冲区,防止任何内容输出到页面
- include_once包含上面构建的URL(如果尚未包含)
- $page=ob_get_contents将输出缓冲区的内容分配给$page变量
- ob_end_clean擦拭输出缓冲区
$data=file\u get\u contents($url)
检索远程数据而不是包括!使用str_replace,他将空格替换为+符号,这样字符串就可以与URL兼容,如果这是你唯一的问题的话。@ThiefMaster是的,这是帮助我删除很多其他东西后的脚本。里面还有其他一些疯狂的东西。我的朋友没有更仔细地检查代码,因为他有事情要做。然而,我永远不会知道安全漏洞,所以谢谢分享+谢谢你告诉我这个漏洞。你的PHP脚本打开了一个巨大的安全漏洞。如果google输出包含PHP标记,它将在您的服务器上执行。使用$data=file\u get\u contents($url)
检索远程数据而不是包括!使用str_replace,他将空格替换为+符号,这样字符串就可以与URL兼容,如果这是你唯一的问题的话。@ThiefMaster是的,这是帮助我删除很多其他东西后的脚本。里面还有其他一些疯狂的东西。我的朋友没有更仔细地检查代码,因为他有事情要做。然而,我永远不会知道安全漏洞,所以谢谢分享+谢谢你告诉我关于光点的事。什么是输出缓冲区?对不起,新来的问题。如果我不使用,会发生什么?“包括url”是什么意思?你提到的代码的其他元素,我不确定我是否理解。。。因为我从未听说过输出缓冲区不过,答案很好。谢谢您的帮助。这里有一些关于PHP输出控件的信息:。如果您没有使用它,那么PHP输出将在执行时发送到浏览器(在代码中运行)。您不必使用它。什么是输出缓冲区?对不起,新来的问题。如果我不使用,会发生什么?“包括url”是什么意思?你提到的代码的其他元素,我不确定我是否理解。。。因为我从未听说过输出缓冲区不过,答案很好。谢谢您的帮助。这里有一些关于PHP输出控件的信息:。如果您没有使用它,那么PHP输出将在执行时发送到浏览器(在代码中运行)。你不必使用它。