php跟据图像中心生成缩略图thumb

如果一张长方形的图像,不管是立像还是卧像,可以跟据图像裁剪成一个正方形,再生成一个缩略图。

//from yiyou.org fy@yiyou.org
function cut2thumbnail($src_file,$dsc_file,$width,$height){
        if(!file_exists($src_file)){
            return false;
        }
        if($width <=0||$height <=0){
            return false;
        }
        $imagetype=  exif_imagetype($src_file);

        $src_img ='';
        switch ($imagetype){
            case IMAGETYPE_PNG:
                $src_img=imagecreatefrompng($src_file);
                break;
            case IMAGETYPE_JPEG:
                $src_img=  imagecreatefromjpeg($src_file); 
                break;
            case IMAGETYPE_BMP:
                $src_img=ImageCreateFromBMP($src_file);
                break;
            default:
                return false;
                break;
        }
        list($src_width,$src_height)=  getimagesize($src_file);
        //如果原图比请求的图像还要小
        if($src_width < $width || $src_height < $height){
            @copy($src_file, $dsc_file);
            return true;
        }
        
        
        $target_image  = imagecreatetruecolor($width,$height);//目标缩小后的图像
        
        $cropped_img=$src_img; //如果$cropped_image未改变,说明自身是正方型
        
        if($src_width > $src_height){ //宽大于高
            $diff=$src_width-$src_height; //差异
            $one_part =floor($diff/2); //取中间
            $cropped_img=  imagecreatetruecolor($src_height, $src_height);
            imagecopy($cropped_img,$src_img,0,0,$one_part,0,$src_height,$src_height);
        }
        if($src_width < $src_height){ //宽小于高
            $diff=$src_height-$src_width; //差异
            $one_part =floor($diff/2); //取中间
            $cropped_img=  imagecreatetruecolor($src_width, $src_width);
            imagecopy($cropped_img,$src_img,0,0,0,$one_part,$src_width,$src_width);
        }
        
        $cropped_width=imagesx($cropped_img);
        $cropped_height=imagesy ($cropped_img);
        
        imagecopyresampled($target_image, $cropped_img, 0, 0, 0, 0, $width, $height, $cropped_width, $cropped_height);

        switch ($imagetype){
            case IMAGETYPE_PNG:
                imagepng($target_image,$dsc_file);
                break;
            case IMAGETYPE_JPEG:
                imagejpeg($target_image, $dsc_file,90);
                break;
            case IMAGETYPE_BMP:
                imagejpeg($target_image,$dsc_file); 
                break;
        }
        return true;
        //imagedestroy($src_img);
        //imagedestroy($cropped_img);
        //imagedestroy($target_image);
}

 

php去掉html标记保留文字内容函数

项目需要,所以自己写了一个,感觉还不错www.yiyou.org

function ClearHtml($content) {
    $content = preg_replace("/<\w+>/i", "", $content);
    $content = preg_replace("/<\w+[^>]*>/i", "", $content); 
    $content = preg_replace("/<\/\w+>/i", "", $content);
    return $content;
}

 

perl过滤文件中标记区的行

perl群有一个网友提问,如何跳过文本文件中特定标记中,整块的行,想想这个问题有点意思,所以睡前思考了一下,把方法写了出来

use strict;


my $del_flag=0;

while(<DATA>){
	chomp;
	if($_=~/^\*block$/){
		#print "found \n";
		if($del_flag==0){
			$del_flag=1;
			next;
		}
		if($del_flag==1){
			$del_flag=0;
			next
		}
		
	}
	next if $del_flag==1;
	print $_,"\n";
}

__DATA__
aaa
aa33
dfsf
sfsf
----
*block
aaa
sfsf
*block
****
sfsfsfs
sfsfsfssfsf
sfsfsfssfsfsf
111111
*block
aaa
sfsf
*block
2222222

 

perl四舍五入

perl 里没有四舍五入函数,不过有个模块

https://metacpan.org/pod/Math::Round::Var

使用比较简单

use Math::Round::Var;
my $rnd = Math::Round::Var->new(0.01);
# rounds to two decimal places:
my $num = 399886.758673;
$num = $rnd->round($num);
print "$num\n"; # 399886.76

php匹配替换文本中的网址加上a-href链接标签

最近有一个项目,需要把用户提交的文本中有网址的内容加上 链接标签,差不多花了一天时间把这个正则写好,效果还不错。给大家分享一个

<?php
$regex='/((http:\/\/|www\.|https:\/\/)(\w+|\.|\?|\=|\/|\&|\:|\d+)+)/';
$str='今天准备来测试一个网址功能的问题,首先使用正常的网址格式是http://aaa.bbs.yiyou.org,有时候我们也可能使用这种方式www.yiyou.org>,如果你会带一个url的网址可能是这样的www.yiyou.org/index.php?aa=aaa&aaa&bb=bbb,但有时候可能是一个伪静态的页面,可能是这样的 http://www.yiyou.org/yiyou/,但很多时候都把http这个内容忘记了,结果是这样的www.yiyou.org/yiyou,至此,网址可以测试了一部分了。再测试一下https://www.yiyou.org/?aa=test,如果加入端口怎么办呢?http://www.yiyou.org:5000/?aaa=bb';
#echo preg_replace($regex,$rep,$str);
echo preg_replace_callback($regex,function($matches){
 #print_r($matches);exit;
 if(!empty($matches[0]) && (strstr($matches[0],'http://')||strstr($matches[0],'https://'))){
        return '<a href="'.$matches[0].'">'.$matches[0].'</a>';
}else{
        return '<a href="http://'.$matches[0].'">'.$matches[0].'</a>';
}

},$str);
echo "<br>";
echo '--------------------<br>';
echo $str;

 

PHP表单常用正则表达式(URL、HTTP、手机、邮箱等)

转自http://www.oschina.net/code/snippet_2009720_38796

<?php
/**
* @description: 正则表达式匹配
*/
class Regex {
/**
* @手机号
*/
public static function Phone($subject) {
$pattern='/^(0|86|17951)?(13[0-9]|15[012356789]|1[78][0-9]|14[57])[0-9]{8}$/';
return Regex::PublicMethod($pattern, $subject);
}
/**
* @数字
*/
public static function Number($subject) {
$pattern='/^[0-9]+$/';
return Regex::PublicMethod($pattern, $subject);
}
/**
* @年份 格式:yyyy
*/
public static function Year($subject) {
$pattern='/^(\d{4})$/';
return Regex::PublicMethod($pattern, $subject);
}
/**
* @月份 格式:mm
*/
public static function Month($subject) {
$pattern='/^0?([1-9])$|^(1[0-2])$/';
return Regex::PublicMethod($pattern, $subject);
}
/**
* @日期 格式:yyyy-mm-dd
*/
public static function Day($subject) {
$pattern='/^(\d{4})-(0?\d{1}|1[0-2])-(0?\d{1}|[12]\d{1}|3[01])$/';
return Regex::PublicMethod($pattern, $subject);
}
/**
* @日期时间 格式:yyyy-mm-dd hh:ii:ss
*/
public static function DateTime($subject) {
$pattern='/^(\d{4})-(0?\d{1}|1[0-2])-(0?\d{1}|[12]\d{1}|3[01])\s(0\d{1}|1\d{1}|2[0-3]):[0-5]\d{1}:([0-5]\d{1})$/';
return Regex::PublicMethod($pattern, $subject);
}
/**
* @邮箱
*/
public static function Email($subject) {
$pattern='/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/';
return Regex::PublicMethod($pattern, $subject);
}
/**
* @邮编
*/
public static function Postcode($subject) {
$pattern='/[1-9]\d{5}(?!\d)/';
return Regex::PublicMethod($pattern, $subject);
}
/**
* @有效图片地址
*/
public static function Photo($subject) {
$pattern='/\b(([\w-]+:\/\/?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|\/)))/';
return Regex::PublicMethod($pattern, $subject);
}
/**
* @URL地址
*/
public static function UrlAddress($subject) {
$pattern='/\b(([\w-]+:\/\/?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|\/)))/';
return Regex::PublicMethod($pattern, $subject);
}
/**
* @有效HTTP地址
*/
public static function EffectiveHttp($subject) {
$pattern='/\b(([\w-]+:\/\/?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|\/)))/';
return Regex::PublicMethod($pattern, $subject);
}
/**
* @身份证
*/
public static function Identity($subject) {
$pattern='/(^\d{15}$)|(^\d{17}([0-9]|X)$)/';
return Regex::PublicMethod($pattern, $subject);
}
/**
* @IPv4
*/
public static function Ipv4($subject) {
$pattern='/^(((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.){3}((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))$/';
return Regex::PublicMethod($pattern, $subject);
}
/**
* @IPv6
*/
public static function Ipv6($subject) {
$pattern='/^([\da-fA-F]{1,4}:){7}[\da-fA-F]{1,4}$/';
return Regex::PublicMethod($pattern, $subject);
}
/**
* @匹配正则公共方法
*/
public static function PublicMethod($pattern, $subject){
if(preg_match($pattern, $subject)){
return true;
}
return false;
}
}

拉黑暴力破解用户邮箱的IP

系统经常有这样的日志,一看就知道是暴力破解邮箱的

warning: unknown[91.200.12.*]: SASL LOGIN authentication failed: UGFzc3dvcmQ6

有时候用户有弱口令,被破解后就会用来狂发垃圾邮件,忍无可忍写了一个perl脚本解决它,凡是尝试超过6次就自动拉黑

#!/usr/bin/perl

use strict;
use File::Tail;
use DB_File;

our $block; #block ip 
our $LOG ='/var/log/mail.log';
system("/sbin/iptables -F");

my $file=File::Tail->new($LOG);

while (defined(my $line=$file->read)) {
   if ($line=~ /SASL LOGIN authentication failed/ and $line=~/((\d{1,3}\.){3}\d{1,3})/){
        my $ip=$1;
        if($block->{$ip}){
           
           my $num=$block->{$ip};
           if($num>=6){
                system("/sbin/iptables -A INPUT -s $ip -j DROP");
                print "$ip blocked\n";
                delete $block->{$ip};
           }
        }
        
        $block->{$ip}+=1;
        
        print  $ip ,'=>',$block->{$ip},"\n";
   }
  
}

 

perl 时间处理2Date::Parse和Date::Format

这两个模块是一对好兄弟

use Date::Parse;
use Date::Format;

之前用

#use Time::ParseDate;
#use DateTime;

但是这两个模块不太符合要求,所以找到刚开始介绍的两个模块

使用方法

my $sec = str2time “2016-05-17 20:10:20”;

say time2str(‘%Y-%m-%d %X’,$sec)

可以得到 2016-05-03 21:53:29 这样的时间格式

详细

https://metacpan.org/pod/Date::Format

https://metacpan.org/pod/Date::Parse