正则贪婪与非贪婪

19 Feb 2016 Category: 基础

贪婪与非贪婪模式影响的是被量词修饰的子表达式的匹配行为,贪婪模式在整个表达式匹配 成功的前提下,尽可能多的匹配,而非贪婪模式在整个表达式匹配成功的前提下,尽可能少 的匹配。

属于贪婪模式的量词,也叫做匹配优先量词,包括:

"{m,n}"、"{m,}"、"?"、"*"和"+"。

在一些使用NFA引擎的语言中,在匹配优先量词后加上”?”,即变成属于非贪婪模式的量词, 也叫做忽略优先量词,包括:

"{m,n}?"、"{m,}?"、"??"、"*?"和"+?"

区别

以字符串<div>test4567</div><div>other</div>为例

表达式<div>.*</div>,匹配的字符串<div>test4567</div><div>other</div> 表达式<div>.*?</div>,匹配的字符串<div>test4567</div> 表达式<div>\w*(\d+)</div>匹配字符串<div>test4567</div>,$1 的值7 表达式<div>\w*?(\d+)</div>匹配字符串<div>test4567</div>,$1 的值4567

说明

贪婪模式,是尽可能多的匹配数据。如果后面有其他的表达式,或者再往后会导致整体匹配 失败,则进行回溯。

非贪婪模式,尽可能少的匹配数据,在保证整体匹配成功的情况下,匹配最少的数据,回溯 多次,确保匹配结果最小。

查看更多

支付宝自动咻一咻python脚本

03 Feb 2016 Category: script

一道过年,各种红包。支付宝的红包虽说今年换了玩法,不过还是点,点,点。这种最适合的就是采用自动化测试那一套。 因此,空闲时看了看android的自动化测试者方面的东西,采用Appium python-client,写了一个测试脚本,对支付宝进行 测试,实现咻一咻自动化。

代码地址github

查看更多

gitbook 安装

22 Jan 2016 Category: tools

gitbook 是github中比较流行用来记录分享的工具,也是写工作文档非常好的工具。 因此打算折腾一番。

GitBook Github地址给出的安装使用步骤:

npm install gitbook-cli -g

gitbook inti

gitbook build

gitbook serve

如果没有墙,上面的步骤都没错!!!

  • 如果不采用国内镜像,install的时候回出现网络超时。
  • 如果使用alias安装的镜像,比如添加一个cnpm命令采用国内镜像,是可以安装,但是当 执行gitbook init命令的时候会自动执行install laste版本的gitbook。因此alias方式的国内 镜像会是的gitbook init失败

因此,最好是添加全局镜像 npm config set registry https://registry.npm.taobao.org

查看更多

sublime markdown preview 输出文档添加日期

20 Jan 2016 Category: tools

最近输出文档都是使用sublime 编辑markdown文件,然后用markdown preview 的方式输出html文件或者pdf。但是每次编辑完之后总是需要手动添加一个更新 日期,未免有些麻烦,而且有时候修改急,会有遗忘的时候。因此想要让sublime 自动为我的文档添加一个update time。

sublime markdown preview插件都是python语言,修改起来还是比较方便。跟踪代码, 发现1191行有save_utf8(tmp_fullpath, html);这里的html内容就是从网络获取之后的 一个html内容。因此如果想要添加内容就要在内容被写入缓存前添加。

但是,有些文件确实不需要添加更新日期,所以还需要为插件添加一项配置项,在插件 的配置文件中添加add_update_time配置项,在MerkdownPreview.py文件中,采用

if settings.get('add_update_time',True)

获取插件配置

因此修改内容为:

if settings.get('add_update_time',True):
    html += "<p>update time "+time.strftime( '%Y-%m-%d %X', time.localtime() )+"</p>"

查看更多

js 脑补

06 Jan 2016 Category: Javascript

js的变量作用域,根据不同的定义位置分为全局变量以及局部变量。同事, 任何没有用var定义的变量都是全局变量。如果没有局部变量,则寻找全局变量。 但是需要注意一点,函数域优于全局域,当变量调用语句在函数域内,同时函数域中也存在 局部变量,则使用的是局部变量,不管调用时,变量是否定义。


var a = 123;//全局变量
function test(){
    alert(a);//弹出undefined,因为此时局部变量a还为定义;
    var a = 1;
    alert(a);//弹出1;
}

如果把函数中var a = 1;注释掉,则会弹出两次123

函数和闭包


function test()
{
    var a = [];
    var i = 0;
    for(i=0;i<3;i++)
    {
        a[i] = function(){
            return i;
        }
    }
    return a;
}

var f = test();
console.log(f[0]);//输出3
console.log(f[1]);//输出3
console.log(f[2]);//输出3

控制台输出 3,3,3

说明: a[i],这里的i是循环的时候就已经确定了。


function(){
    return i;
}

这里的i是test函数执行完之后,即循环三次之后的i,因此i=3;

如果想要是想a[0] = 0;需要在函数定义的时候,将i作为参数传入函数中。


function test()
{
    var a = [];
    var i = 0;
    for(i=0;i<3;i++)
    {
        a[i] = (function(x){
            return x;
        })(i)
    }
    return a;
}

var f = test();
console.log(f[0]);//输出0
console.log(f[1]);//输出1
console.log(f[2]);//输出2

查看更多

PHP 松散比较的几个值

04 Jan 2016 Category: PHP

PHP中几个比较容易混乱的值:false,’0’,0,’‘,null,array().这几个值在if判断中都是false,那么他们之间相互进行’==’比较呢?

一下是这几个值的比较结果:

  0 ‘0’ false ’’ null array()
0 true true true true true false
‘0’ true true true false false false
false true true true true true true
’’ true false true true true false
null true false true true true true
array() false false true false true true

php按一下顺序进行比较运算:

  • null或string与string比较,先转换成string再比较

  • bool和null与其他任何类型比较,转换成bool

  • string和number相互比较,先转换成数字类型

  • bool与任何其他类型比较,先转换成bool值

  • array和任意其他类型比较,或其他类型与数组比较,都是数组大。所以0 == array 是false

查看更多

PHP 数组相加与array_merge的区别

01 Jan 2016 Category: PHP

PHP合并数组可以使用”+”号或者array_merge函数。那么这两个不同的方式有什么区别呢?

  • 数字键名的情况
$a = ["php","java"];
$b = ["c++","python","vb"];

var_dump($a+$b);//输出["php","java","vb"]
var_dump(array_merge($a,$b));["php","java","c++","python","vb"]

数字键的时候,两个数组相加,如果键名相同,留先出现的,后面的不要。array_merge是吧两个数组完全合并在一起

  • 字符串键名的情况
$a = ["name"=>"Lili","sex"=>0];
$b = ["name"=>"LiHao","sex"=>1,"age"=>22];
var_dump($a+$b);//输出["name"=>"Lili","sex"=>0,"age"=>22]
var_dump(array_merge($a,$b));//输出["name"=>"LiHao","sex"=>1,"age"=>22];

字符串键名数组相加也是取首先出现的数组做最后的结果。array_merge是后面的数据覆盖前面的数据。

查看更多

PHP 盲点扫描 01

31 Dec 2015 Category: PHP

PHP语言由于其语法简单,没有数据类型,因此会有不少不易被发现的盲点,这些盲点一旦在 应用中出现,非常具有隐蔽性,很难发现,因为很多都会让你觉得不科学。但是,当你 仔细阅读PHP手册,还真是这样。

  • 1.PHP中,对一个null值,用数组的方式获取元素,不报错。但是对一个空数组获取不存在的元素会报错。
$a = null;
var_dump($a['tttt']);//输出null,不报错。

$b = array();
var_dump($b['tttt']);//throw exception undefiend index
  • 2.php中会对字符串数学运算会对字符串进行转换,按十进制方式
$x = 0123;          // 八进制,相当于十进制83
$y = "0123" + 0     // 十进制123
  • 3.字符串在和数字数学运算或者比较中都会进行类型转换。

  • 4.PHP魔术变量

    _FUNCTION_ and _METHOD_ as in PHP 5.0.4 is that _FUNCTION_ returns only the name of the function while as _METHOD_ returns the name of the class alongwith the name of the function

<?php
namespace test\example;
class Obj {
    function test() {
        echo __FILE__ . "<br/>"; //绝对路径
        echo __LINE__ . "<br/>"; //行号
        echo __NAMESPACE__ . "<br/>"; //完整命名空间test\example
        echo __FUNCTION__ . "<br/>"; //当前函数名称test
        echo __METHOD__ . "<br/>"; //带命名空间的类方法test\example\Obj::test
        echo __CLASS__ . "<br/>"; //带命名空间的类test\example\Obj
    }
}
$obj = new Obj();
$obj::test();
?>
  • 5.__CLASS__和get_class($this)

<?php

class base_class
{
    function say_a()
    {
        echo "'a' - said the " . __CLASS__ . "<br/>";
    }

    function say_b()
    {
        echo "'b' - said the " . get_class($this) . "<br/>";
    }

}

class derived_class extends base_class
{
    function say_a()
    {
        parent::say_a();
        echo "'a' - said the " . __CLASS__ . "<br/>";
    }

    function say_b()
    {
        parent::say_b();
        echo "'b' - said the " . get_class($this) . "<br/>";
    }
}

$obj_b = new derived_class();

$obj_b->say_a();
echo "<br/>";
$obj_b->say_b();

?>

输出结果:

'a' - said the base_class
'a' - said the derived_class

'b' - said the derived_class
'b' - said the derived_class

__CLASS__获取的是__CLASS__所在的类的类名 getclass($this)是获取当前类的类名.

  • 6.PHP 子类中调用父类函数,父类函数中的$this到底指谁?
<?php

class MyParent {
    public $name = 'parent';
    function test() {
        var_dump($this);
        echo $this->name . "<br/>";
    }
}

class Child extends MyParent {
    public $name = 'child';
    function test() {
        parent::test();
        echo $this->name . "<br/>";
    }
}

$parent = new MyParent();
$parent->test();

$child = new Child();
$child->test();
?>

输出结果

object(MyParent)#1 (1) { ["name"]=> string(6) "parent" } parent
object(Child)#2 (1) { ["name"]=> string(5) "child" } child
child
  • 7.递增/递减运算符不影响布尔值。递减 NULL 值也没有效果,但是递增 NULL 的结果是 1。字符串的自增自减,如果不能转换成合法的数字,则根据ASCII码进行
$a = "012";
$b = "AA";

for($i=0;$i<5;$i++)
{
    echo ++$a;//输出13,14,15,16,17
    echo ++$b;//输出AB,AC,AD,AE,AF
}

查看更多