如何使用Php实现Google /Baidu Ping服务快速收录

玩过WORDPRESS的朋友应该都知道ping服务吧,通俗点讲它可以在更新文章的时候向Google、baidu及其他支持ping的搜索引擎发送指令然后招呼它们过来,不用傻等他们过来收录了,化被动为主动了。直接贴代码了,很简单的。

/**
  +------------------------------------------------------------------------------
 * 通知搜索引擎过来抓去最新发布的内容。秒收不是梦
 * 目前仅支持Google和Baidu
  +------------------------------------------------------------------------------
 */
class Ping {
 
    public $method, $callback;
 
    public function method($site_name, $site_url, $update_url, $update_rss) {
        $this->method = '
    < ?xml version="1.0" encoding="UTF-8"?>
    
      weblogUpdates.extendedPing
      
     {$site_name}
     {$site_url}
     {$update_url}
     {$update_rss}
      
    ';
        return $this->method;
    }
 
    public function _post($url, $postvar) {
        $ch = curl_init();
        $headers = array(
            "POST " . $url . " HTTP/1.0",
            'Content-type: text/xml;charset="utf-8"',
            "Accept: text/xml",
            "Content-length: " . strlen($postvar)
        );
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $postvar);
        $res = curl_exec($ch);
        curl_close($ch);
        return $res;
    }
 
    public function google() {
        $this->callback = $this->_post('http://blogsearch.google.com/ping/RPC2', $this->method);
        return strpos($this->callback, "0") ? true : false;
    }
 
    public function baidu() {
        $this->callback = $this->_post('http://ping.baidu.com/ping/RPC2', $this->method);
        return strpos($this->callback, "0") ? true : false;
    }
     
}


下面演示一下如何调用

$Ping=new Ping();
$Ping->method('xxx博客', 'https://saycn.net/', 'https://saycn.net/xxx', 'https://saycn.net/feed');
$Ping->baidu();
$Ping->google();

PHP去除Html所有标签、空格以及空白

笔者在前几天做微信自定义分享网页的时候,自定义内容的时候需要去除内容的标签并截取部分内容作为简介便用到了下面了的函数,现在笔者把他分享出来,希望能够帮到大家

function cutstr_html($string, $sublen)    
 {
      $string = strip_tags($string);
      $string = trim($string);
      $string = ereg_replace("t","",$string);
      $string = ereg_replace("rn","",$string);
      $string = ereg_replace("r","",$string);
      $string = ereg_replace("n","",$string);
      $string = ereg_replace("    ","",$string);
      return trim($string);
}

微信(weixin)分享网页自定义缩略图、链接、标题和摘要

由于微信分享是通过WeixinJSBridge实现的。所以用户只需要将下面这段Js代码复制到网页中,定义好对应的参数即可

  var imgUrl = 'https://saycn.net/xxx.jpg';
        var lineLink = 'https://saycn.net/904';
        var descContent = "这是xxx的博客";
        var shareTitle = 'xxx';
        var appid = '';
        
        function shareFriend() {
            WeixinJSBridge.invoke('sendAppMessage',{
                "appid": appid,
                "img_url": imgUrl,
                "img_width": "200",
                "img_height": "200",
                "link": lineLink,
                "desc": descContent,
                "title": shareTitle
            }, function(res) {
                //_report('send_msg', res.err_msg);
            })
        }
        function shareTimeline() {
            WeixinJSBridge.invoke('shareTimeline',{
                "img_url": imgUrl,
                "img_width": "200",
                "img_height": "200",
                "link": lineLink,
                "desc": descContent,
                "title": shareTitle
            }, function(res) {
                   //_report('timeline', res.err_msg);
            });
        }
        function shareWeibo() {
            WeixinJSBridge.invoke('shareWeibo',{
                "content": descContent,
                "url": lineLink,
            }, function(res) {
                //_report('weibo', res.err_msg);
            });
        }
        // 当微信内置浏览器完成内部初始化后会触发WeixinJSBridgeReady事件。
        document.addEventListener('WeixinJSBridgeReady', function onBridgeReady() {
            // 发送给好友
            WeixinJSBridge.on('menu:share:appmessage', function(argv){
                shareFriend();
            });
            // 分享到朋友圈
            WeixinJSBridge.on('menu:share:timeline', function(argv){
                shareTimeline();
            });
            // 分享到微博
            WeixinJSBridge.on('menu:share:weibo', function(argv){
                shareWeibo();
            });
        }, false);

zbp已有模块内容的更新(重建)的两种方法

都是以插件的形式实现,以侧栏标签云模块为例

一、对原有模块内容的重写。

(1)首先挂接接口 

 Add_Filter_Plugin('Filter_Plugin_Zbp_Load','BuildModule_Populartags');

(2)接口函数的编写

//热门标签模块重建(开始)
function BuildModule_Populartags()
{
    global $zbp;
    $zbp->RegBuildModule('tags', 'BuildModule_Populartags');
    $s = '';
    $i = $zbp->modulesbyfilename['tags']->MaxLi;
    if ($i == 0)
        $i = 25;
    $array  = $zbp->GetTagList('*', '', array(
        'tag_Count' => 'DESC'
    ), $i, null);
    $array2 = array();
    foreach ($array as $tag) {
        $array2[$tag->ID] = $tag;
    }
    ksort($array2);
     
    foreach ($array2 as $tag) {
        $s .= ' <a href="' . $tag->Url . '" title="' . $tag->Count . '个话题" style="font-size:12px"> ' . $tag->Name . ' </a>';
    }
     
    return $s;
}
//重建热门标签模块结束

启用方法:进入模块管理的tags列表,点击提交就可以移到侧栏使用了。

二、对原有模块内容的直接替换。

(1)挂接接口:

Add_Filter_Plugin('Filter_Plugin_Index_Begin','Tblogpublished');
Add_Filter_Plugin('Filter_Plugin_Search_Begin','Tblogpublisheds');

(2)替换函数的编写:

function Tblogpublished(){
    global $zbp;
    if(isset($zbp->modulesbyfilename['tags'])){
    $zbp->modulesbyfilename['tags']->Content =Tblog_Get_tags();
    }
}
function Tblogpublisheds(){
    global $zbp;
    if(isset($zbp->modulesbyfilename['tags'])){
    $zbp->modulesbyfilename['tags']->Content =Tblog_Get_tags();
    }  
}

(3)新的标签云内容的编写:

function Tblog_Get_tags(){
global $zbp;
$zbp->header .='<script src="'.$zbp->host.'zb_users/plugin/ttyb_newlypublished/js/3D-Tags.js" type="text/javascript"></script>';
$zbp->header .= "<link rel="stylesheet" href="{$zbp->host}zb_users/plugin/ttyb_newlypublished/css/3dstyle.css" type="text/css" />rn";
$s = '';
$s.= '<div id="div1">';
    $i = $zbp->modulesbyfilename['tags']->MaxLi;
    if ($i == 0) $i = 25;
    $array = $zbp->GetTagList('*', '', array('tag_Count' => 'DESC'), $i, null);
    $array2 = array();
    foreach ($array as $tag) {
        $array2[$tag->ID] = $tag;
    }
    ksort($array2);
    $clor123=array("tblogred","tblogblack","tblogblue","tblogorange","tblogpink","tblogpurple");
    foreach ($array2 as $tag) {
        $s .= '<a href="' . $tag->Url . '"  class="'.$clor123[rand(0,5)].'" >' . $tag->Name . '(' . $tag->Count . ')</a>';
    }
$s.= '</div>';  
    return $s;
}

+-比较前面两个方法:

到这里已经全部介绍完两种方法,在这里来比较下两个方法:

相同点:

(1)都是可以实现模块内容的更新。

(2)显示数量等可以到模块管理面设置。

不同点:

(1)第一种方法:可以实现启用的时候必须要到模块管理里面管理重写提交下或者新建的tag的时候才能使用(相对tags来说,别的类似),第二种方法可以。

(2)第二种方法的动态内容的实现比较灵活。比如对于新建的模块内容是动态的,要实现动态的更换就会很麻烦。需要来回重写模块。那就费事了。(有点过了。要是介绍新建模块就好了。呵呵,以后介绍。)(可以忽略第二条。)

IE下实现placeholder效果的jquery插件

发现ie11都不支持placeholder,这是相当悲剧的。下面贴出一段简单的解决方法:

$(document).ready(
  function () {
    var doc = document,
      inputs = doc
        .getElementsByTagName('input'),
      supportPlaceholder = 'placeholder' in doc
        .createElement('input'),
      placeholder = function (
        input) {
        var text = input.getAttribute('placeholder'),
          defaultValue = input.defaultValue;
        if (defaultValue == '') {
          input.value = text
          input.setAttribute("old_color", input.style.color);
          input.style.color = "#c0c0c0";
        }
        input.onfocus = function () {
          this.style.color = this.getAttribute("old_color");
          if (input.value === text) {
            this.value = ''
          }
        };
        input.onblur = function () {
          if (input.value === '') {
            this.style.color = "#c0c0c0";
            this.value = text
          }
        }
      };
    if (!supportPlaceholder) {
      for (var i = 0, len = inputs.length; i < len; i++) {
        var input = inputs[i],
          text = input
            .getAttribute('placeholder');
        if (input.type === 'text' && text) {
          placeholder(input)
        }
      }
    }
  }
);

直接引用这段js就可以了。

原理

就是通过js获取表单的title,然后把title写入到表单中,当表单激活的时候,再清空表单内容就可以了。

添加播放器

JW FLV PLAYER 中文文档

使用方法:如果你仅需要播放一个FLV文件[例如“video.flv”],那么只要把“video.flv”和压缩包内的

flvplayer.swf复制到同一个目录内,然后在页面内添加

程序代码

<object type="application/x-shockwave-flash" width="400" height="220"
wmode="transparent" data="flvplayer.swf">
<param name="movie" value="flvplayer.swf" />
<param name="wmode" value="transparent" />
<object/>

“flvplayer.swf”会自动找到同一目录内的“video.flv”播放。也可以在“flvplayer.swf”后添加FLV文件的URL

来进行播放。方法如下:

程序代码

<object type="application/x-shockwave-flash" width="400" height="220"
wmode="transparent data="flvplayer.swf?file=movies/holiday.flv">
<param name="movie" value="flvplayer.swf?file=movies/holiday.flv" />
<param name="wmode" value="transparent" />
</object>

“file=movies/holiday.flv”就是参数,可以使用相对或者绝对地址。

其他参数说明:

如果载入影片时不需要自动播放,可以使用“autostart”参数

例子

程序代码

<object type="application/x-shockwave-flash" width="400" height="220"
wmode="transparent" data="flvplayer.swf?autostart=false">
<param name="movie" value="flvplayer.swf?autostart=false" />
<param name="wmode" value="transparent" />
</object>

多个参数可以混合使用,有效的参数列表:

程序代码

file (FLV文件的地址)

autostart (是否允许自动播放,”true”或者”false”)

image (未播放时的预览图片,只支持JPEG格式)

repeat (是否重复播放)

clicktext (开始时显示的文字,默认是”click to play”)

下面是3.12版本http://www.cgfans.net/bbs/Medias/2007/10/jw_flv_player.zip这个是3.12版本

这篇文档包含了JW MP3 Player,JW FLVPlayer,JW Media Player,JW Image Rotator的安装方法和配置方

JW PLAYERS 3.12 文档

1,安装 (在你的站点里嵌入)

2,参数 (配置)

基本参数

颜色参数

界面参数

播放参数

互动参数

3,播放列表

4,自定义

5,支持

快速配置,可运行配置向导

1,安装

下载后,你可以得到一个例子,当用文本或HTML编辑器打开的时候,你可以发现swf是用一段短小的

javascript嵌入到页面上的。这个Javascript是Geoff Stearns写的swfobject.js,它解决了Flash需要激

活的麻烦。当复制swf到你的站点的时候,不要忘记了把swfobject.js一同复制过去。并且在页面中的

Head中加入下面代码

程序代码

<script type=”text/javascript” src=”swfobject.js”></script>

在swfobject.js的帮助下你可以方便的设置swf的路径,宽度,高度,背景颜色和所需要的Flash播放器的版本,也可

以通过它设置一组参数来配置swf。当页面加载的时候,javascript会根据id来替换页面中的节点。

程序代码

<p id="player"><a href="http://www.myfileserver.com/folder/mediaplayer.swf" width="400" height="400"
type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"
flashvars="file=http://www.myfileserver.com/folder/test.flv&displayheight=300" />

2,参数

这些参数可以配置被嵌入到html中的播放器的行为和外观。如果使用swfobject.js,可以用addVariable()方法来配

置,如果使用的embed方式,可以通过定义”flashvars”属性来配置变量,注意用”&”符号分割这些变量。

被*号标注的同样适用于 JW Image Rotator

基本变量

displayheight(number):显示区域的高度.控制区域最小高度是20px,当该值大于或等于swf的高度时,播放列表会

自动隐藏,否这会显示。

file*(url):要播放文件的地址。 支持单文件播放(MP3/FLV/RTMP/JPG/SWF/PNG/GIF),也支持播放列表。JW Image

Rotator只支持列表

height*(number):设置swf的高度,当使用embed方式插入的时候,在embed的属性里已经设置了。但是有时候(特

别是使用IE的时候)高度会变的不确定,影响了布局,这时候需要通过该参数设置下,该值的单位是px

image(url):当你播放mp3,flv的时候,你可以通过该值设置一个预览图作为专辑封面,支持 JPG/SWF/PNG/GIF

file. 你也可以在播放列表中对每一项进行设置。

shownavigation*(true,false):该参数仅被JW Image Rotator支持。用来显示或隐藏图片导航。

transition* (fade,bgfade,blocks,bubbles,circles,fluids,lines,random,slowfade): 该参数仅被JW Image

Rotator支持。用来设置图片替换的效果。 设置为”random” 将随机的设置效果.默认值为 “fade”.

width*(number):设置swf的宽度,其他同height;

颜色变量

backcolor*(color):设置播放器的背景颜色。JW Media Player等默认为 0xFFFFFF (白色) JW Image Rotator默认为

0x000000 (黑色).

fontcolor*(color):设置文字和按钮的颜色。JW Media Player等默认为 0x000000 (黑色) JW Image Rotator默认为

0xFFFFFF (白色).

lightcolor*(color):设置被被激活状态的颜色。JW Media Player等默认为 0x000000 (黑色) JW Image Rotator默

认为 0xCC0000 (红色).

界面参数

autoscroll(true,false):当播放列表过长的时候,默认会自动显示滚动条。当该值设置为’true’的时候,会自动

根据鼠标滚动播放列表。

displaywidth(number of pixes):设置显示区域的宽度,当设置的比较小的时候,播放列表会显示在显示区域的右侧

而不是底部。

kenburns* (true,false): 用以实现在运动的时候实现kb效果(Ken Burns effect),注意,当图比较大,而且网速

比较快的时候,建议打开,否则关闭。建议设置transition为”slowfade”来配合。

largecontrols (true,false): 设置该值为true用来放大控制区域的按钮。建议为视力不好的用户打开

logo* (url): 设置一个图片用来作为右上角的水印,支持所有图片格式,支持通明图层的png效果最佳。

overstretch* (true,false,fit,none): 设置图片/影片在显示区域的缩放。”true”等比例拉伸用来符合显示区

域。”false”仅拉伸合显示区域。”fit”全屏显示。”none”显示原始大小。JW Media Player等默认为”fit”,JW Image

Rotator默认为”false”

showdigits (true,false,total): 设置为”false”隐藏播放时间等信息用来节省控制区域的空间。设置为”total”用

来显示全部时间。

showdownload (true,false):设置该值用来在控制区域显示下载按钮。链接到link所设置的地址。

showeq (true,false): 用来显示一个假的音频波动效果。当播放mp3的时候打设置该值可以得到很好的效果

showicons* (true,false): 用来显示或者隐藏显示区域中间的图片,JW Media Player等默认为true。JW Image

Rotator默认为false;

showvolume (true,false): 用来设置是否显示音量控制按钮

thumbsinplaylist (true,false): 设置列表中是否显示预览图

播放参数

autostart (true,false,muted): 设置为ture,页面加载完后会自动播放。设置为muted,会在静音模式下自动播放

,并且显示区域中间有静音图标。bufferlength (number): 设置flv的缓存时间。默认为3秒

repeat* (true,false,list): 默认为flase,从当前播放位置播放到列表尾部后停止。设置为list会播放列表中所有

的项目,设置为true会循环播放。

rotatetime* (number): 设置图片的显示时间。JW Media Player等默认为10秒,JW Image Rotator默认为5秒

shuffle* (true,false): 设置为false顺序播放,设置为true无序播

smoothing (true,false): 设置为false关闭视频平滑处理,推荐设置true用以得到更好效果。但对于大屏幕或者配

置低的机器设置false是有好处的

start* (second): 在使用RTMP 或 HTTP 流媒体的时候(非常规的flv/mp3),使用该变量准确的定位开始位置。该参

数设置在XSPE格式的列表中以便准且的设置文件的章节。

volume* (number): 设置音量,默认为80.

互动参数

audio* (url):用这个参数来添加一个mp3文件作为单独的音频,可以作为图片的背景音乐解说等。

bwfile (url):用以带宽检测的文件的地址,可以放一个图片,或者rtmp流媒体。可以在右键菜单中查看到贷款数值

bwstreams (comma-separated list of bitrates):

和bwfile配合使用,根据带宽值来选择不同的文件。如:你要播放video.flv并且设置该项的值为100,250,500,1000,

当播放器发现带宽为349kbps的时候,将会播放video_250.flv。所以他有一套有效的命名设置,他将会自动切换,哪

怕是在采用播放列表的情况下。

callback (url):设置这个参数为服务端程序(php/asp)地址用来回传数据。在每个项播放和停止的时候会发送数据

到服务器,以便在服务器端保存播放统计。

captions (url): 设置该值用以载入一个文本格式的文本作为字幕。播放器至支持SMIL格式和DVD的SRT格式的字幕。

如果你的flv文件内置字体你可以设置该值为”captionate”.如果你有多频道字幕,可以设置这个值为”captionate0″,

“captionate3″等。可以在列表中设置每一个项的值。

enablejs* (true,false): 设置为true打开对javascript的支持。仅支持在线使用。javascript可以控制播放,加载

媒体,获得当前播放项的详尽信息。

fsbuttonlink (url):如果用户的flashplayer版本高于(9.0.28)播放器会自动的显示一个全屏按钮。通过设置该值

,你可以链接到另外的页面用以全屏显示。服务端程可以设定将要播放的文件。

id (string): 播放器的唯一标识。将会被回传到服务器端。

javascriptid* (string):如果你的页面上有多个播放器,你可以设置这个参数给每个播放器不同的id,这样就可以

方便的用javascript来控制。他将回传到getUpdate()事件中。

link (url): 通过这个参数用来设置一个可现在的版本,或者强制用户通过该地址下载当前项。可以在播放列表中为

每一项设置该值。

linkfromdisplay* (true,false):设置显示区域被点击时要访问的页面。默认点击显示区域时会进行播放/暂停操作

linktarget* (frame): 设置链接目标,”_self”在当前页打开。”_blank”在新页面中打开。

streamscript (url):设置这个参数为了兼容‘伪流媒体’FLV文件。

type (mp3,flv,rtmp,jpg,png,gif,swf,rbs,3gp,mp4,m4v): 播放器会根据文件名的最后三个字符来判断类型。在你

使用服务器端语言进行重定向时,这种方法将不会再有效。所以你可以设置这个参数来告诉播放器文件类型。你也可

以在播放列表中对每一项进行设置。如果播放器找不到文件类型将会被识别为播放列表。

useaudio (true,false): 设置为false用来改变为静音状态。

usecaptions (true,false):设置为false隐藏字幕.

usefullscreen (true,false):如果你不希望用flashplayer9的全屏模式。可以设置”fsbuttonlink”参数用来替换全

屏按钮的事件。

usekeys (true,false): 设置为”false”用来取消键盘操作(SPACE,UP,DOWN,LEFT,RIGHT)

注意:你必须对?=&进行字符转移。? → %3F, = → %3D, & → %26. 你的”file” 变量为getplaylist.php?id=123的

时候必须设置为 getplaylist.php%3Fid%3D123.

播放列表

当播放列表中只有一个项目的时候,播放器会用单文件播放模式进行播放。播放器根据文件名来区分单文件和播放列

表文件。如你的加载文件名为test.mp3的文件,播放器会用单文件播放模式去播放mp3,因为扩展名是mp3.如果你的

文件名是getlist.php,播放器会认为这是个播放列表。如果你使用了动态脚本来加载一个单文件如

播放器支持三种常用的播放列表格式来确保通用性。XSPF,RSS和ATOM。

播放器所支持的XSPF/RSS/ATOM列表的通用标签。

表格

 


*Image Rotator仅支持播放列表中的第一个’audio’项,被用来做为背景音乐来播放。播放器会播放所有的音乐项

目。

** “category” 元素可以用来支持广告。你可以设置该值为”preroll”, “postroll” 或 “overlay”.

使用”link”播放列表中单项的值为广告地址。

*** “start”元素只被XSPF的播放列表格式支持。该元素用来设置流媒体文件(HTTP or RTMP)的开始位置,单位为秒

**** XSPF列表格式中的”location”元素中如果不包含常见的扩展名(如 “mp3” or “flv”),可以使用”meta”元素指定

文件格式。(如 <meta rel=’”type”>mp3</meta> ).在使用RSS和ATOM的情况下,文件格式被自动的根据mimetype来识

别。

RTMP streams, the additional “id” flashvar has to be sent as well. Example:

“file=rtmp://my.streaming.server/mypath” and “id=video_one”.

注意,当你播放单文件的时候,你支持所有的参数,如你可以添加一个image,title,id,link等。如当你用单文件

播放模式播放”video.flv”时你也想添加一个预览图,你可以设置参数”file=video.flv”,”image=preview.jpg”.当你

播放RTMP流媒体的时候,你可以添加参数”id”.如”file=rtmp://my.streaming.server/mypath” ,”id=video_one”.

特别指出两个容易出错的地方。第一列表必须和播放器在同一个服务器上,这是flash的安全机制导致的。第二,要

使用完整的地址格式包含http,以免播放器找不到文件。

自定义

有人多人要求我创建一些可自定义的版本。他们的很多要求其实已经可以通过设置参数来实现了。我做了一个在线配

置向导可以简单的配置这些参数。我没有精力去满足所有人的要求。不过在下一个版本中会有很多有趣的附加功能。

如果你熟悉actionscript脚本语言,你可以自己修改程序添加功能。

播放器在实例的时候会最近会加完配置和播放列表变量,然后进入MCV的生命周期。在MCV生命周期中,配置和列表管

理器(feeder)始终是有效的。

红色标注的两个对象的所有方法可以通过javascript调用。

在另外的flash程序中是可以引用播放器的。只要从下载的flv文件中复制出图像到你的flv中,并且确保将下载的com

目录复制到你的flv文件中,里面包含了所有的脚本。然后你就可以在时间轴的第一个帧的位置访问变量了。注意要

设置高度和宽度的变量,否则播放器会根据你的尺寸拉伸变形。

程序代码

// Set the flashvars (booleans and numbers should also be quoted)
var width = "320";
var height = "240";
var file = "my_video.flv";
var autostart = "true";
// Start the player
var mpl = new com.jeroenwijering.players.MediaPlayer(this.player);
Additionally, I have made the controller a public object, so you can control the mediaplayer with the
sendEvent() function from anywhere in your flash site (the schematic above has a list of all
sendEvent() options). Let’s continue the small script above:

我为播放器创建了公开的controller对象,所以你可以在你程序的任何地方通过使用sendEvent()来控制播放器,

如:

程序代码mpl.controller.sendEvent(“volume”,50);

mpl.controller.sendEvent(“playpause”);

支持

常见问题列表

1.如果你在使用ie的情况下出现了布局错乱的情况,那可能是大小没有别设定好,你可以使用变

量”width”和”height”来强行设置。

2.注意,flash和javascript的安全机制会影响你的本地测试。当你的文件放在不同的服务器上的时候也会受到影响

,你可以尝试放在同一个服务器上。

3.全屏功能只有在flash player9.028.0以上版本才能使用,如果你使用了swfobject来嵌入你的播放器,你可以使用

他的自动升级功能。注意设置 “allowfullscreen” 为true

4.如果你的进度条不动,或者你的视频的长度有问题。那可能是你的flv没有设置正确的metadata。你可以使用一个

小工具flvmdi

shell命令的批量修改文件内容

简单修改:

1,使用sed的打印功能,在执行替换前检查一下

$sed -n '/.png/p'  c*.htm

2,没有问题的话,执行替换

$sed -i  's/.png/.gif/'  c*.htm

3,如果你在执行替换前想做一个备份(在原文件之后加.bak扩展名)

$sed -i.bak 's/.png/.gif/' c2.htm
(修改c2.htm的同时,备份修改前的文件为c2.htm.bak文件)

 

多命令结合修改:

 

Linux下批量替换多个文件中的字符串的简单方法。用sed命令可以批量替换多个文件中的字符串。

用sed命令可以批量替换多个文件中的字符串。 

sed -i “s/原字符串/新字符串/g” `grep 原字符串 -rl 所在目录`(千万注意这个符号,是最左上角那个符号不是单引号)

例如:我要把/test下所有包含abc的文件中的abc替换为def,执行命令: 

sed -i "s/oldstring/newstring/g"  `grep oldstring -rl /test` [格式为:sed -i "s/ / /g" filenames]

这是目前linux最简单的批量替换字符串命令了!

具体格式如下: 

sed -i "s/oldString/newString/g" `grep oldString -rl /path`

 

方法2:

在日程的开发过程中,可能大家会遇到将某个变量名修改为另一个变量名的情况,如果这个变量是一个局部变量的话,vi足以胜任,但是如果是某个全局变量的话,并且在很多文件中进行了使用,这个时候使用vi就是一个不明智的选择。这里给出一个简单的shell命令,可以一次性将所有文件中的指定字符串进行修改:

grep “abc” * -R | awk -F: ‘{print $1}’ | sort | uniq | xargs sed -i ‘s/abc/abcde/g’

替换字符:sed -i “s/old/new/g” /test

查找包含指定字符的文件名:grep aaa –ul  /test

 

替换整行为新字符串

 

根据行的部份字符串布配后替换整行为新字符串:

 sed -i  ‘s/^teststring.*/teststring 888888/’ test.conf 

 –将test.conf文件中以teststring串开头的整行替换为teststring 888888

 sed -i.bak  ‘s/^teststring.*/teststring 888888/’ test.conf

 –修改并备份修改前的文件为test.conf.bak文件

删除指定行:

sed -i  “/anonymous/d” /etc/passwd

sed -i  “/anonymous/d” /etc/group

JS 控制VIEWPORT在微信上正常显示

经常在做移动手机网站的时候由于需要在微信平台推广我们不得不去兼容他。在IOS上由于苹果把控的很好,浏览器内核都是统一的。所以自然没有兼容问题。但是安卓就不同了,碎片化的缘故。加上微信的WEBVIEW是定制过的浏览器,导致和原生的效果不同。下面是一个兼容方案。

首先你要设置meta viewport属性。

<meta name="viewport" content="width=device-width, target-densityDpi=device-dpi, user-scalable=yes">

然后再JS代码中设置如下代码

var viewport = document.querySelector("meta[name=viewport]");
var winWidths=$(window).width();
var densityDpi=640/winWidths;
	densityDpi= densityDpi>1?300*640*densityDpi/640:densityDpi;
if(isWeixin()){
	viewport.setAttribute('content', 'width=640, target-densityDpi='+densityDpi);
}else{
	viewport.setAttribute('content', 'width=640, user-scalable=no');
	window.setTimeout(function(){
		viewport.setAttribute('content', 'width=640, user-scalable=yes');
	},1000);
}
function isWeixin(){
	var ua = navigator.userAgent.toLowerCase();
	if(ua.match(/MicroMessenger/i)=="micromessenger") {
		return true;
	} else {
		return false;
	}

快拿起安卓手机试试吧!

在做WEB前端开发时可以借鉴的规范

一、文件命名规范

images  //图片资源,如果项目多人开发里面还需要用子文件夹分开
fonts    //字体资源,一般就是特殊字体嵌入或者图标字体
styles   //CSS文件
– app.css //reset样式,如果项目小直接写在里面,如果多人开发则需要分开如:app.xxx.css
– app.a.css
– app.b.css
scripts //javascripts
– jquery.js
– app.js //主程序
videos  //视频
sounds //音频
index.html //HTML文件

注:所有文件夹以及文件名都是小写,编码都均采用UTF-8编码

二、书写规范

1.所有HTML标签都必须使用小写。
2.CSS能用id的尽量用id,能复用的要使用class。
3.样式文件要在head标签内,脚本要再底部。
4.如果页面图片量很多,要使用JS脚本按需动态加载。
5.如果要兼容retina屏幕要使用 srcset和-webkit-image来设置2x质量图片。
6.如果文档模式是<!doctype html>可以不用写<br />中的斜杠。(当然包含其他无内容tag)
7.引用脚本和者样式去掉type属性,能节省一点是一点。
8.不管是HTML还是CSS或是JS都需要写注释,代码不仅要自己看得懂,让别人看得懂也很重要。
9.开发的时候CSS不要堆在一行编写,等项目完全编写完后再用压缩工具整体压缩。
10.编写JS的时候开始大括号要跟在语法后面不要另起一行,JS命名方式采用驼峰。

function isEmail(){
   //do something….
}
11.切图的时候如果是全彩图片则使用jpg格式且用80%质量,如果带有透明要使用png24格式。
12.书写链接地址时, 必须避免重定向,例如:href=”http://jinzhe.net/”, 即须在URL地址后面加上“/”。
13.在页面中尽量避免使用style属性,即style=”…”。
14.给区块代码及重要功能(比如循环)加上注释, 方便后台添加功能。
15.能以背景形式呈现的图片, 尽量写入css样式中。
16.重要图片必须加上alt属性; 给重要的元素和截断的元素加上title。
17.CSS属性书写顺序, 建议遵循:  布局定位属性–>自身属性–>文本属性–>其他属性. 此条可根据自身习惯书写, 但尽量保证同类属 性写在一起. 属性列举: 布局定位属性主要包括: display & list-style & position(相应 的 top,right,bottom,left) & float & clear & visibility & overflow; 自身属性主要包括: width & height & margin & padding & border & background; 文本属性主要包括:color & font & text-decoration & text-align & vertical-align & white- space & 其他 & content; 我所列出的这些属性只是最常用到的, 并不代表全部。
18.样式表中中文字体名, 请务必转码成unicode码, 以避免编码错误时乱码。
19.jQuery变量前面要加$

三、图片规范

1. 所有页面元素类图片均放入images文件夹, 测试用图片放于images/demo文件夹;
2. 图片格式仅限于png,jpg;
3. 命名全部用小写英文字母、 数字、 _ 的组合,其中不得包含汉字、空格、特殊字符;尽量用易懂的词汇, 便于团队其他成员理 解; 另, 命名分头尾两部分, 用下划线隔开, 比如ad_1.jpg,btn_submit.png;
4. 在保证视觉效果的情况下选择最小的图片格式与图片质量, 以减少加载时间;
5. 尽量避免使用半透明的png图片;
6. 运用css sprite技术集中小的背景图或图标, 减小页面http请求, 但注意, 请务必在对应的sprite psd源图中划参考线, 并保存至images目录 下.

四、注释规范

1. html注释: 注释格式 <!–这儿是注释–>, ‘–‘只能在注释的始末位置,不可置入注释文字区域;
2. css注释: 注释格式 /*这儿是注释*/;
3. JavaScript注释, 单行注释使用’//这儿是单行注释’ ,多行注释使用 /* 这儿有多行注释 */;

CSS Sprites的优势与切图方法

众所周知,减少网站加载时间的最有效的方式之一就是减少网站的HTTP请求数。实现这一目标的一个有效的方法就是通过CSS Sprites——将多个图片整合到一个图片中,然后再用CSS来定位。(现在各大门户网站都在这样使用)

 

下面是一张样图:

Sprite Example

本文的目的并不是讲CSS Sprite如何让一个网站更快,而是说一些使用CSS Sprite的时候的一些最佳实践。

不要等到你完成切片之后才开始sprite.

如果你边切图边写CSS,然后等你完成了整个网站之后再来拼接这些图片到一个Sprite中,你就不得不完全重写你的CSS,你也必须要花费很多的时间来用PS拼接大量的图片——这是件令人倍感纠结的事情。但是如果边切图边整合,就会比较容易些。

把图片放到它要显示的地方的相对的地方

这个小技巧貌似比较难理解。我直到创建一个比较大的sprite的时候才理解到这一点。比如,如果我们希望一个图片出现在一个元素的左侧:

Sprite positioning example

将那个图片放到sprite图片的右边(本文开始的那个sprite图片)。这样的话,当你通过CSS移动背景图片的位置的时候,基本上不可能有其它的小图片意外的出现在它的附近。使用Sprite的时候常常遇到的一个问题是图片会出现在它不该出现的位置。

定位时避免使用bottom或right等

当使用CSS sprite的时候,只用background-position: bottom -300px或background-position: right -200px;非常容易。这刚开始的时候是可行的,但是问题是,当你在宽度上或高度上扩展相关sprite图片的时候,原先设置的位置可能是错的,因为那个图片已经不再Sprite图片的底部或右部了。使用确切的位置来避免这个问题。

给每个图片足够的空间

就像你在本文顶部的实例图片看到的那样,那些小图片都被预留了足够的空间。为什么不把他们塞到一块来让sprite图片更小呢? 因为使用这些图片的元素通常都会有大量的内容而且可能会需要扩展的间距,以至于其它图片不会意外出现。

例子:

Variable content example

例子中的每个条目都有个带数字的图片作为背景图片。如果你仔细看了上面的那张图片,你可以看到这三个数字图片是如何错开排列的,这样如果内容增多,其它图片就不会意外出现。

不用担心Sprite图片的像素大小

如果你的网站经过良好的设计,那么你将会有一大堆的图片来整合进到sprite里面,这样你就需要你个非常大的sprite来恰当的放置这些图片。这是很不错的。sprite里的空白不会占用太多的文件大小。addons.mozilla.org上使用的Sprite图片有1,000px×2,000 px那么大,但是图片的大小仅仅16.7kb!

简单介绍一下 CSS Sprites 的优点:

  • 当用户往U盘中拷200张图片,会等很久。但是如果弄成一个文件,再拷贝就会快很多。
  • CSS Sprites 的目的就是通过整合图片,减少对服务器的请求数量,从而加快页面加载速度。

CSS Sprites的优势与切图方法

实现方法

  1. 首先将小图片整合到一张大的图片上
  2. 然后根据具体图标在大图上的位置,给背景定位。
    background-position:-8px -95px;