PHP与命令行交互(实现查找和替换)
<?php教程
// Ask for Input
fwrite(STDOUT, "Please Select Option(Default is Find) [1]Find [2]Replace Please Input Number: ");
// Get Input
$todo = trim(fgets(STDIN));
if(empty($todo)) $todo =1;
if($todo != 1 && $todo !=2){
echo "Selected Error! ";
exit;
}
if($todo==1){
fwrite(STDOUT,"Please Input Find Directory(Default is Current Directory):");
$dir = trim(fgets(STDIN));
if(empty($dir)){
$dir = getcwd();//当前目录
}else{
if(!is_dir($dir)){
echo "Directory Not Exist! ";
exit;
}
}
fwrite(STDOUT,"Please Input Content of the Find:");
$search = trim(fgets(STDIN));
echo "In Directory'".$dir."'Find'".$search."',Please Wait... ";
exec("find ".$dir." -exec grep --exclude='*.svn/*' -- '".$search."' {} +",$output);
foreach($output as $val){
echo "$val ";
}
}else{// write input back
fwrite(STDOUT, "Please Input Find Directory(Default is Current Directory):");
$dir = trim(fgets(STDIN));
if(empty($dir)){
$dir = getcwd();//当前目录
}else{
if(!is_dir($dir)){
echo "Directory Not Exist! ";
exit;
}
}
fwrite(STDOUT,"Please Input Prefix(Default is php):");
$ext = trim(fgets(STDIN));
if(empty($ext)) $ext = 'php';
fwrite(STDOUT,"Please Input Find Content:");
$search = trim(fgets(STDIN));
fwrite(STDOUT,"Please Input Replace Content:");
$replace = trim(fgets(STDIN));
echo "正在目录'".$dir."'查找后缀为'".$ext."'的文件,将内容'".$search."'替换为'".$replace."',请稍后... ";
exec("find ".$dir." -name '*.".$ext."' -exec sed --in-place 's/".$search."/$replace/g' {} ;");
echo "Replace Completed! ";
}
?>
获取所有可用的模块 - get_loaded_extensions
该函数返回所有已经加载的(可用的)模块。
用法:
print_r(get_loaded_extensions());
2. 获取指定模块的可用函数 - get_extension_funcs
该函数返回指定模块所有可用的函数。传入的参数(模块名称)必须是小写
用法:
print_r(get_extension_funcs("gd"));
3. 获取所有已经定义的函数 - get_defined_functions
该函数返回所有已经定义的函数,包括内置函数和用户自定义函数。
用法:
function myrow($id, $data){
return "<tr><th>$id</th><td>$data</td></tr>\n";
}
$arr = get_defined_functions();
print_r($arr);
输出:
Array
(
[internal] => Array
(
[0] => zend_version
[1] => func_num_args
[2] => func_get_arg
[3] => func_get_args
[4] => strlen
[5] => strcmp
[6] => strncmp
...
[750] => bcscale
[751] => bccomp
)
[user] => Array
(
[0] => myrow
)
)
其中 $arr["internal"] 是内置函数, $arr["user"] 是用户自定义函数。
4. 检查指定函数是否存在 - function_exists
该函数返回指定函数是否已经定义。
用法:
if (function_exists('imap_open')) {
echo "IMAP functions are available.<br />\n";
} else {
echo "IMAP functions are not available.<br />\n";
}
/**************************************************************
02 *
03 * 使用特定function对数组中所有元素做处理
04 * @param string &$array 要处理的字符串
05 * @param string $function 要执行的函数
06 * @return boolean $apply_to_keys_also 是否也<SPAN class=t_tag onclick=tagshow(event) href="tag.php教程?name=%D3%A6%D3%C3">应用</SPAN>到key上
07 * @access public
08 *
09 *************************************************************/
10 function arrayRecursive(&$array, $function, $apply_to_keys_also = false)
11 {
12 foreach ($array as $key => $value) {
13 if (is_array($value)) {
14 arrayRecursive($array[$key], $function, $apply_to_keys_also);
15 } else {
16 $array[$key] = $function($value);
17 }
18
19 if ($apply_to_keys_also && is_string($key)) {
20 $new_key = $function($key);
21 if ($new_key != $key) {
22 $array[$new_key] = $array[$key];
23 unset($array[$key]);
24 }
25 }
26 }
27 }
28
29 /**************************************************************
30 *
31 * 将数组转换为JSON字符串(兼容中文)
32 * @param array $array 要转换的数组
33 * @return string 转换得到的json字符串
34 * @access public
35 *
36 *************************************************************/
37 function JSON($array) {
38 arrayRecursive($array, 'urlencode', true);
39 $json = json_encode($array);
40 return urldecode($json);
41 }
AdodbZip1.1有更新,更新了下载地址。
SmartyZip,一个Smarty的装载类
<?php教程
// 设定参数
SmartyZip::$zip_url = 'http://www.smarty.net教程/distributions/Smarty-2.6.26.zip'; //[设置项]Smarty的Zip文件下载地址
SmartyZip::$zip_file = sys_get_temp_dir () . preg_replace ( '/^.*/(Smarty-.*.zip)$/i', 'smarty/$1', SmartyZip::$zip_url ); //[设置项]Smarty的Zip文件缓存位置
SmartyZip::$entry_dir = preg_replace ( '/^.*/(Smarty-.*).zip$/i', '$1/libs', SmartyZip::$zip_file );
SmartyZip::$extract_dir = sys_get_temp_dir () . 'smarty/' . SmartyZip::$entry_dir; //[设置项]Smarty程序文件缓存位置
SmartyZip::$template_dir = dirname ( realpath ( __FILE__ ) ); //[设置项]Smarty模板文件 所在位置
SmartyZip::$compile_dir = sys_get_temp_dir () . 'smarty/template_c/' . md5 ( SmartyZip::$template_dir ); //[设置项]Smarty编译文件缓存位置
// 注册协议
if (! in_array ( 'SmartyZip', stream_get_wrappers () )) {
stream_wrapper_register ( 'SmartyZip', 'SmartyZip' );
}
// 定义常量
if (! defined ( 'SMARTY_DIR' )) {
define ( 'SMARTY_DIR', 'SmartyZip://' );
}
// 包含程序
require_once (SMARTY_DIR . 'Smarty.class.php');
// $smarty = SmartyZip::init(new Smarty); // [选择项]引用即定义$smarty
// return SmartyZip::init(new Smarty); // [选择项]引用即返回$smarty,注意只可引用一次。
/**
* SmartyZip类定义
*/
class SmartyZip {
/**
* Smarty变量
*/
public static $zip_url;
public static $zip_file;
public static $entry_dir;
public static $extract_dir;
public static $template_dir;
public static $compile_dir;
/**
* Stream变量
*/
private $handle;
public $context;
/**
* Smarty函数组
*/
/**
* init
* @param Smarty &$smarty
* @return Smarty
*/
public static function init(&$smarty) {
$smarty->template_dir = self::$template_dir;
if (! is_dir ( self::$compile_dir )) {
if (mkdir ( self::$compile_dir, 0777, true ) === false) {
header ( 'Content-type: text/html;charset=utf-8' );
die ( '请创建目录 ' . self::$compile_dir );
}
}
$smarty->compile_dir = self::$compile_dir;
return $smarty;
}
/**
* Stream函数组
*/
/**
* __construct
*/
public function __construct() {
}
/**
* stream_cast
* @param int $cast_as
* @return resource
*/
public function stream_cast($cast_as) {
return false;
}
/**
* stream_close
*/
public function stream_close() {
fclose ( $this->handle );
}
/**
* stream_eof
* @return bool
*/
public function stream_eof() {
return feof ( $this->handle );
}
/**
* stream_flush
* @return bool
*/
public function stream_flush() {
return fflush ( $this->handle );
}
/**
* stream_lock
* @param mode $options
* @return bool
*/
public function stream_lock($options) {
return flock ( $this->handle, $options );
}
/**
* stream_open
* @param string $path
* @param string $mode
* @param int $options
* @param string &$opend_path
* @return bool
*/
public function stream_open($path, $mode, $options, &$opend_path) {
// 验证文件地址
if (! preg_match ( '/^.*?://(.*)$/', $path, $matches )) {
return false;
}
$tmp_file = self::$extract_dir . DIRECTORY_SEPARATOR . $matches [1];
$entry_file = self::$entry_dir . '/' . str_replace ( '\', '/', $matches [1] );
$zip_file = self::$zip_file;
// 验证程序文件
if (! file_exists ( $tmp_file ) || file_exists ( $zip_file ) && filectime ( $tmp_file ) < filectime ( $zip_file )) {
// 下载文件
if (! file_exists ( $zip_file )) {
// 目录处理
if (! is_dir ( dirname ( self::$zip_file ) )) {
if (mkdir ( dirname ( self::$zip_file ), 0777, true ) === false) {
header ( 'Content-type: text/html;charset=utf-8' );
die ( '请创建目录 ' . $zip_dir );
}
}
// 下载文件
if (! file_exists ( self::$zip_file )) {
$break = true;
do {
$url_arr = parse_url ( self::$zip_url );
$fp = fsockopen ( $url_arr ['host'], isset ( $url_arr ['port'] ) ? ( int ) $url_arr ['port'] : 80, $errno, $errstr, 10 );
if ($fp === false) {
break;
}
$out = "GET " . $url_arr ['path'] . " HTTP/1.0rnHost: " . $url_arr ['host'] . " rnConnection: closernrn";
fputs ( $fp, $out );
if (feof ( $fp )) {
break;
}
$buffer = fgets ( $fp, 1024 );
if (! preg_match ( '/^HTTP/1.d 200 /i', $buffer )) {
break;
}
$content_length = false;
$content_start = false;
while ( ! feof ( $fp ) ) {
$buffer = fgets ( $fp, 1024 );
if ($buffer === "rn") {
$content_start = true;
break;
}
if (preg_match ( '/^Content-Length:s*(d+)/i', $buffer, $matches )) {
$content_length = ( int ) $matches [1];
}
}
if ($content_length === false || $content_start === false) {
break;
}
$content = stream_get_contents ( $fp );
if ($content === false) {
break;
}
$result = file_put_contents ( self::$zip_file, $content );
unset ( $content );
if ($result === false) {
break;
}
fclose ( $fp );
} while ( $break = false );
if ($break) {
header ( 'Content-type: text/html;charset=utf-8' );
die ( '请下载文件 <a href="' . self::$zip_url . '">' . self::$zip_url . '</a > 保存为 ' . self::$zip_file );
}
}
}
// 创建目录
$tmp_dir = dirname ( $tmp_file );
if (! is_dir ( $tmp_dir )) {
if (mkdir ( $tmp_dir, 0777, true ) === false) {
header ( 'Content-type: text/html;charset=utf-8' );
die ( '请创建目录 ' . $tmp_dir );
}
}
// 打开压缩文件
$zip = zip_open ( $zip_file );
if (! is_resource ( $zip )) {
return false;
}
// 寻找解压文件
do {
$entry = zip_read ( $zip );
if (! is_resource ( $entry )) {
return false;
}
if (zip_entry_name ( $entry ) == $entry_file) {
break;
}
} while ( true );
// 转存压缩文件
zip_entry_open ( $zip, $entry );
file_put_contents ( $tmp_file, zip_entry_read ( $entry, zip_entry_filesize ( $entry ) ) );
zip_entry_close ( $entry );
zip_close ( $zip );
}
// 打开文件
$this->handle = fopen ( $tmp_file, $mode );
if (! is_resource ( $this->handle )) {
return false;
}
return true;
}
/**
* stream_read
* @param int $count
* @return string
*/
public function stream_read($count) {
return fread ( $this->handle, $count );
}
/**
* stream_seek
* @param int $offset
* @param int $whence=SEEK_SET
* @return bool
*/
public function stream_seek($offset, $whence = SEEK_SET) {
return fseek ( $this->handle, $offset, $whence );
}
/**
* stream_set_option
* @param int $option
* @param int $arg1
* @param int $arg2
* @return bool
*/
public function stream_set_option($option, $arg1, $arg2) {
return false;
}
/**
* stream_stat
* @return array
*/
public function stream_stat() {
return fstat ( $this->handle );
}
/**
* stream_tell
* @return int
*/
public function stream_tell() {
return ftell ( $this->handle );
}
/**
* stream_write
* @param string $data
* @return int
*/
public function stream_write($data) {
return fwrite ( $this->handle, $data );
}
/**
* url_stat
* @param string $path
* @param int $flag
* @return array
*/
public function url_stat($path, $flag) {
if (! preg_match ( '/^.*?://(.*)$/', $path, $matches )) {
return false;
}
$tmp_file = self::$extract_dir . DIRECTORY_SEPARATOR . $matches [1];
if (file_exists ( $tmp_file )) {
if ($flag & STREAM_URL_STAT_LINK) {
return lstat ( $tmp_file );
} else {
return stat ( $tmp_file );
}
}
if ($flag & STREAM_URL_STAT_QUIET) {
$file_stat = lstat ( __FILE__ );
$mode = $file_stat ['mode'];
// smarty plugins adjust
if (strpos ( $matches [1], 'plugins' . DIRECTORY_SEPARATOR . 'compiler.' ) !== false) {
if (strpos ( $matches [1], 'plugins' . DIRECTORY_SEPARATOR . 'compiler.assign.php' ) === false) {
$mode = 0;
}
} elseif (strpos ( $matches [1], 'plugins' . DIRECTORY_SEPARATOR . 'block.' ) !== false) {
if (strpos ( $matches [1], 'plugins' . DIRECTORY_SEPARATOR . 'block.textformat.php' ) === false) {
$mode = 0;
}
}
$arr = array ('dev' => 0, 'ino' => 0, 'mode' => $mode, 'nlink' => 0, 'uid' => 0, 'gid' => 0, 'rdev' => 0, 'size' => 0, 'atime' => 0, 'mtime' => 0, 'ctime' => 0, 'blksize' => 0, 'blocks' => 0 );
return array_merge ( array_values ( $arr ), $arr );
}
return false;
}
}
?>
使用Smarty很简单:
1. 包含SmartyZip文件。
2. 使用SmartyZip::init(new Smarty)自动为smarty对象设置默认路径。
样例代码:view sourceprint?1 <?php
2 include_once 'SmartyZip.php';
3 $smarty = SmartyZip::init(new Smarty);
4 $smarty->assign ( 'name', 'SmartyZip' );
5 $smarty->display ( 'test.<SPAN class=t_tag onclick=tagshow(event) href="tag.php?name=html">html</SPAN>' );
6 ?>
1.远程图片本地化要求空间相应目录可写外还要求php教程的allow_url_fopen 选项设置为On
这些是远程图片本地化的必要条件,但并不是说有了这些就一定可以远程图片本地化了,这个与对方的服务器和网络环境整体情况都有很大的关系(对php来说是不可控的),
2.DEDECMS里面保存远程图片的函数
/dede/inc/inc_archives_functions.php 主要是获得图片保存的
/include/pub_collection_functions.php 不能直接保存下来的,或者有简单防盗链的。造假Referer。
相关文章
- 要替换字符串中的内容我们只要利用php相关函数,如strstr,str_replace,正则表达式了,那么我们要替换目录所有文件的内容就需要先遍历目录再打开文件再利用上面讲的函数替...2016-11-25
使用percona-toolkit操作MySQL的实用命令小结
1.pt-archiver 功能介绍: 将mysql数据库中表的记录归档到另外一个表或者文件 用法介绍: pt-archiver [OPTION...] --source DSN --where WHERE 这个工具只是归档旧的数据,不会对线上数据的OLTP查询造成太大影响,你可以将...2015-11-24- grep命令是Linux系统中最重要的命令之一,功能是从文本文件或管道数据流中筛选匹配的行和数据,如果再配合正则表达式,功能十分强大,是Linux运维人员必备的命令,这篇文章主要介绍了Linux中grep详解,需要的朋友可以参考下...2023-02-15
- 这篇文章主要介绍了C#隐式运行CMD命令(隐藏命令窗口),本文实现在winform窗口中运行CMD命令,需要的朋友可以参考下...2020-06-25
- MySQL日志主要包含:错误日志、查询日志、慢查询日志、事务日志、二进制日志;日志是mysql数据库的重要组成部分。日志文件中记录着mysql数据库运行期间发生的变化;也就是说用来记录mysql数据库的客户端连接状况、SQL语句...2015-11-24
- 本文实例讲述了PHP实现连接设备、通讯和发送命令的方法。分享给大家供大家参考。具体如下:开发的BS架构的软件(PHP),需要跟设备进行通讯,在此记录一下,欢迎各位指正:1. 采用php socket技术使用TCP/IP连接设备参数$service_po...2015-10-21
- 一、连接Mysql格式: mysql -h主机地址 -u用户名 -p用户密码1、连接到本机上的MYSQL。首先打开DOS窗口,然后进入目录mysql/bin,再键入命令mysql -u root -p,回车后提示你输密码.注意用户名前可以有空格也可以没有空格,但是密...2015-11-08
jQuery实现滑动页面固定顶部显示(可根据显示位置消失与替换)
本文实例讲述了jQuery实现滑动页面固定顶部显示(可根据显示位置消失与替换)。分享给大家供大家参考,具体如下:这里介绍的jQuery拉动页面固定顶部显示,及自动消失效果,可能ie浏览器下有问题,不过火狐什么的都可以运行看效果...2015-10-30- 这篇文章主要介绍了JS基于正则截取替换特定字符之间字符串操作方法,结合具体实例形式分析了JS基于正则实现针对特殊字符、数字等字符串类型的截取操作相关技巧,需要的朋友可以参考下...2017-02-08
- 这篇文章主要介绍了解决jmap命令打印JVM堆信息异常的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-12-04
- Redis 是一个开源、高性能的Key-Value数据库,被广泛应用在服务器各种场景中。本文介绍几个查看Redis内存信息的命令,包括常用的info memory、info keyspace、bigkeys等。...2021-01-15
- 这篇文章主要介绍了C#命令行编译器配置方法,本文讲解了配置C#命令行编译器、配置其它.NET命令行工具、通过csc命令行编译器来编译C#文件实例等内容,需要的朋友可以参考下...2020-06-25
- 下面是我们经常会用到且非常有用的MySQL命令。下面你看到#表示在Unix命令行下执行命令,看到mysql>表示当前已经登录MySQL服务器,是在mysql客户端执行mysql命令。 登录MySQL,如果连接远程数据库,需要用-h指定hostname。登...2015-11-24
- 这篇文章主要介绍了用golang实现替换某个文件中的字符串操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-25
- 这篇文章给大家介绍了Idea使用正则表达式批量替换字符串的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧...2021-07-21
- 这篇文章主要介绍了如何使用Swift来实现一个命令行工具,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-30
- 这篇文章主要介绍了批量复制及执行命令shell脚本,本文通过列举几个示例给大家详细介绍,对大家的工作或学习具有一定的参考借鉴价值,需要的朋友可以参考下...2020-07-11
- 这篇文章主要介绍了C#实现的调用DOS命令操作类,实例分析了C#调用系统常用DOS命令的相关技巧,非常具有实用价值,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了一条命令重启所有已停止的docker容器操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-11-20
MySQL中的alter table命令的基本使用方法及提速优化
一、基本用法1. 增加列alter table tbl_name add col_name type例如, 给pet的表增加一列 weight,mysql>alter table pet add weight int;2. 删除列alter table tbl_name drop col_name例如, 删除pet表中的weight这一...2015-11-24