29

php常用基本函数

15个PHP常用函数

1.统计数组元素个数

2. 循环删除目录

Continue reading

29

PHP遍历文件函数glob,比opendir和readdir效率高

PHP遍历文件函数glob,比opendirreaddir效率高(亲测,效率高出至少一倍以上),而且使用起来相对灵活,尤其针对遍历文件名为部分未知的情况,书写更为方便。

在遍历非同级目录文件时,因为glob函数返回是带路径的文件名(如下第三个例子),所以如果需要取文件名则需要使用basename函数。

glob函数

函数说明:array glob ( string $pattern [, int $flags ] )
功能:寻找与模式匹配的文件路径,返回包含匹配文件(目录)的数组(注:被检查的文件必须是服务器系统的,不能用于远程文件)
参数说明:第一个参数:匹配模式;第二个可选参数:
GLOB_MARK – 在每个返回的项目中加一个斜线
GLOB_NOSORT – 按照文件在目录中出现的原始顺序返回(不排序)
GLOB_NOCHECK – 如果没有文件匹配则返回用于搜索的模式
GLOB_NOESCAPE – 反斜线不转义元字符
GLOB_BRACE – 扩充 {a,b,c} 来匹配 ‘a’,’b’ 或 ‘c’
GLOB_ONLYDIR – 仅返回与模式匹配的目录项
GLOB_ERR – Stop on read errors (like unreadable directories), by default errors are ignored.

参数 GLOB_BRACE

 

23

JS使用replace()方法匹配替换手机号、座机号、带区号连接符座机号

老客户的一论坛需要把会员发布的手机号、座机号转成可点击拨号的链接,首先我考虑,是要在会员发布提交时进行处理,还是在发布后进行处理。

我选择在发布后进行前台处理。

需要使用JS replace()方法和正则知识

另一篇关于replace方法与正则基础知识的介绍

测试代码实例:

解释:

因为客户代码中是要对不相连的多个区块中进行处理,所以选择器只能抓取comeing类,这样的话,下面就必须使用for循环,如果可以选择整个区域的话,那选择器就抓取mrdede类,不使用for循环,matchHtml = matchS.eq(i).html()改为matchHtml = matchS.html()即可。

replace方法正则替换

var regexp = new RegExp(/(1)(2)(3)/g);

se = matchHtml.replace(regexp, ‘$3 $1 $2′);

RegExp中的正则表达式,其中在两个正斜杠“/”之间区域,有并列的多个(),

那么这多个()把匹配的内容,从左向右依次为$1 $2 $3 ……

如果:

var regexp = new RegExp(/(123)/g);

se = matchHtml.replace(regexp, ‘$1我被找到了’);

RegExp中的正则表达式,其中在两个正斜杠“/”之间区域,只有一个()或没有(),

那么只有$1可以参与替换,

替换时不是一定要使用$1 $2 $3 …… 进行替换,也可以使用其它字符进行替换。

关于实例中正则的解释(从左向右依次解释):

全部原始正则表达式([^0-9])([0-1]{1}[1-9][0-9]{1,2}[^0-9]?[0-9]{7,8}|[1-9]\d{6,7})([^0-9])

([^0-9])以非数字开头(即$1)

原始中的第二段([0-1]{1}[1-9][0-9]{1,2}[^0-9]?[0-9]{7,8}|[1-9]\d{6,7}) 即$2

[0-1]{1}解释:0到1之间(含)的数字必须出现一次

[1-9]解释:1到9之间(含)的数字必须出现一次

[0-9]{1,2}解释:0到9之间(含)的数字至少出现一次,最多出现两次

[^0-9]?解释:非数字的任意一个字符至少出现0次,最多出现一次

[0-9]{7,8}解释:0到9之间(含)的数字至少出现7次,最多出现8次

|解释:或者的意思

[1-9]解释:1到9之间(含)的数字必须出现一次

\d{6,7}解释:0到9之间(含)的数字至少出现6次,最多出现7次

最后面的([^0-9])解释:以非数字结尾(即$3 这样就能保证不匹配以0或1开头的大于12位的数字串了)

注注注:

此正则写法只可使用在JS的replace方法进行替换的情况,如果想用在其它地方,需要去掉正则前后的([^0-9]) 即使用[^0-9])([0-1]{1}[1-9][0-9]{1,2}[^0-9]?[0-9]{7,8}|[1-9]\d{6,7})([^0-9],但是如果想更严谨一些的话,可以再改造。

其实我写的这段正则用在replace方法中匹配替换手机号与座机号时,还是不太严谨,但是绝大多数情况还是可以的。

==========================================

修改:

就在刚才,发布完文章,又做了一下修改,上面实例中双斜杠注释掉的部分是原来的

在它下面两行是改后的,这样就更严谨一些了。

var regexp = new RegExp(/([^0-9])([0-1]{1}[1-9][0-9]{1,2})([^0-9]?)([0-9]{7,8}|[1-9]\d{6,7})([^0-9])/g);

se = matchHtml.replace(regexp, '$1<a style="color:#09f;text-decoration:underline;" href="tel:$2$4">$2$3$4</a>$5');

把原来中间部分([0-1]{1}[1-9][0-9]{1,2}[^0-9]?[0-9]{7,8}|[1-9]\d{6,7})改为([0-1]{1}[1-9][0-9]{1,2})([^0-9]?)([0-9]{7,8}|[1-9]\d{6,7})

也就是把原来的中间部分分成了三个部分,现在全部正则为/([^0-9])([0-1]{1}[1-9][0-9]{1,2})([^0-9]?)([0-9]{7,8}|[1-9]\d{6,7})([^0-9])/ 

所以在替换的时候就有$1$2$3$4$5这五个部分可以参与替换了。

其中$2各$4是实际打可拨打号码的部分,所以在链接中使用href=”tel:$2$4″

中间部分就是$2$3$4的组合了

尾部$5

这样就防止替换的座机号存在非数字时也参与拨号的情况出现了,如抓取到的号码为010-12345678或010 12345678,在拨打时就是01012345678

我不知道在拨号时区号与直拨号间有横杠或空格时能不能拨得出去,没试,也就不试。

个人感觉,严谨一些的话,还是现在这样写正则比较好。

==========================================

再次修改正则:

上一次修改后不能匹配7位和8位的电话直拨号,有错误。

这回测试了,可用,没问题了。哈哈

另附一图,关于replace的替换变量的规律的,如下:

JS使用replace()方法匹配替换手机号、座机号、带区号连接符座机号

23

JS replace方法替换字符串实例及正则表达式基础知识

1、javascript 正则对象替换创建 和用法: /pattern/flags  先简单案例学习认识下replace能干什么

正则表达式构造函数: new RegExp("pattern"[,"flags"]);

正则表达式替换变量函数:stringObj.replace(RegExp,replace Text);

参数说明:
pattern — 一个正则表达式文本
flags — 如果存在,将是以下值:
g: 全局匹配
i: 忽略大小写
gi: 以上组合 Continue reading

15

PHP中extract()的使用方法

年前年后没什么活儿,闲着没事时准备把织梦折采集功能提出来,经过改造移植进Destoon网站系统。在改造的过程中,也碰到了很多新知识来学习。

Destoon源码根目录common.inc.php文件约第80多行,源码如下:

if($_POST) extract($_POST, EXTR_SKIP);
if($_GET) extract($_GET, EXTR_SKIP);

注:不要对不能信任的数据使用 extract()

测试实例:

form.html

action.php

extract(),它的主要作用是将数组展开,键名(name)作为变量名,元素值(value)为变量值,可以说为数组的操作提供了另外一个方便的工具,比方说,可以很方便的提取$_POST或者$_GET的元素,对表单提交过来的内容不用一一赋值。

int extract ( array $var_array [, int $extract_type [, string $prefix ]] )

extract() 检查每个键名看是否可以作为一个合法的变量名,同时也检查和符号表中已有的变量名的冲突。对待非法/数字和冲突的键名的方法将根据 extract_type 参数决定。可以是以下值之一:

EXTR_OVERWRITE
如果有冲突,覆盖已有的变量。
EXTR_SKIP
如果有冲突,不覆盖已有的变量。
EXTR_PREFIX_SAME
如果有冲突,在变量名前加上前缀 prefix 。
EXTR_PREFIX_ALL
给所有变量名加上前缀 prefix 。自 PHP 4.0.5 起这也包括了对数字索引的处理。
EXTR_PREFIX_INVALID
仅在非法/数字的变量名前加上前缀 prefix 。本标记是 PHP 4.0.5 新加的。
EXTR_IF_EXISTS
仅在当前符号表中已有同名变量时,覆盖它们的值。其它的都不处理。可以用在已经定义了一组合法的变量,然后要从一个数组例如 $_REQUEST 中提取值覆盖这些变量的场合。本标记是 PHP 4.2.0 新加的。
EXTR_PREFIX_IF_EXISTS
仅在当前符号表中已有同名变量时,建立附加了前缀的变量名,其它的都不处理。本标记是 PHP 4.2.0 新加的。
EXTR_REFS
将变量作为引用提取。这有力地表明了导入的变量仍然引用了 var_array 参数的值。可以单独使用这个标志或者在 extract_type 中用 OR 与其它任何标志结合使用。本标记是 PHP 4.3.0 新加的。
如果没有指定 extract_type ,则被假定为 EXTR_OVERWRITE。

注意 prefix 仅在 extract_type 的值是 EXTR_PREFIX_SAME,EXTR_PREFIX_ALL,EXTR_PREFIX_INVALID 或 EXTR_PREFIX_IF_EXISTS 时需要。如果附加了前缀后的结果不是合法的变量名,将不会导入到符号表中。前缀和数组键名之间会自动加上一个下划线。

extract() 的一种可能用法是将 wddx_deserialize() 返回的结合数组中的内容导入到符号表变量中去。

Example#1 extract() 例子

上例将输出:

blue, large, sphere, medium

$size 没有被覆盖,因为指定了 EXTR_PREFIX_SAME,这使得 $wddx_size 被建立。如果指定了 EXTR_SKIP,则 $mrdede_size 也不会被建立。EXTR_OVERWRITE 将使 $size 的值为“medium”,EXTR_PREFIX_ALL 将建立新变量 $mrdede_color,$mrdede_size 和 $mrdede_shape。

必须使用关联数组,数字索引的数组将不会产生结果,除非用了 EXTR_PREFIX_ALL 或者 EXTR_PREFIX_INVALID。

十一 07

PHP输出函数有哪些?

1 echo();2 print();3 print_r();4 printf();5 sprintf();6 die();7 var_dump();8 var_export();

echo

返回值是void,可以一次输出多个值,多个值之间用逗号分隔。echo是语言结构(language construct)也就是关键字,而并不是真正的函数,因此不能作为表达式的一部分使用。使用的时候不用加括号,加上也可以。只支持基本类型,布尔型除外,echo true的时候显示1,echo false的时候啥都没有。echo不可以输出数组类型

print()

只可以同时输出一个字符串,一个变量,不支持逗号分隔多个显示变量的语法,需要圆括号,print能输出数组类型的数据,返回值是int,当其执行失败时返flase。print  的用法和C语言很像,所以会对输出内容里的%做特殊解释。

print_r()

不仅可以打印变量的的值,还能显示变量类型,而且也可以显示数组和对象这样复杂的变量类型。print_r() 将把数组的指针移到最后边。使用 reset() 可让指针回到开始处。print_r()可以把字符串和数字简单地打印出来,而数组则以括起来的键和值得列表形式显示,并以Array开头。 Continue reading

十一 07

PHP $_SERVER 相关信息

$_SERVER中存着很多信息,备份待用。

以下四行,是我们相对常用的

  1. $_SERVER['HTTP_ACCEPT_LANGUAGE']//浏览器语言
  2. $_SERVER['REMOTE_ADDR'] //当前用户 IP 。
  3. $_SERVER['REMOTE_HOST'] //当前用户主机名,DNS 反向解析不依赖于用户的 REMOTE_ADDR。
  4. $_SERVER['REQUEST_URI'] //URL

其它:

  1. $_SERVER['SCRIPT_FILENAME'] //当前执行脚本的绝对路径名。
  2. $_SERVER['SCRIPT_URI'] //用来指定访问的页面,如:“/index.html”
  3. $_SERVER['REMOTE_PORT'] //端口。
  4. $_SERVER['SERVER_ADDR'] //当前运行脚本所在的服务器IP
  5. $_SERVER['SERVER_NAME'] //服务器主机的名称。
  6. $_SERVER['PHP_SELF']//正在执行脚本的文件名
  7. $_SERVER['argv'] //传递给该脚本的参数。
  8. $_SERVER['argc'] //传递给程序的命令行参数的个数。
  9. $_SERVER['GATEWAY_INTERFACE']//CGI 规范的版本。
  10. $_SERVER['SERVER_SOFTWARE'] //服务器标识的字串,在响应请求时的头信息中给出
  11. $_SERVER['SERVER_PROTOCOL'] //请求页面时通信协议的名称和版本
  12. $_SERVER['REQUEST_METHOD']//访问页面时的请求方法
  13. $_SERVER['REQUEST_TIME'] //请求开始时的时间戳。从 PHP 5.1.0 起可用
  14. $_SERVER['QUERY_STRING'] //查询(query)的字符串,如果有的话,通过它进行页面访问。
  15. $_SERVER['DOCUMENT_ROOT'] //当前运行脚本所在的文档根目录
  16. $_SERVER['HTTP_ACCEPT'] //当前请求的 Accept: 头部的内容,如果存在的话。
  17. $_SERVER['HTTP_ACCEPT_CHARSET'] //当前请求的 Accept-Charset: 头部的内容,如果存在的话。
  18. $_SERVER['HTTP_ACCEPT_ENCODING'] //当前请求的 Accept-Encoding: 头部的内容
  19. $_SERVER['HTTP_CONNECTION'] //当前请求的 Connection: 头部的内容。例如:“Keep-Alive”。
  20. $_SERVER['HTTP_HOST'] //当前请求的 Host: 头部的内容,如果存在的话。
  21. $_SERVER['HTTP_REFERER'] //链接到当前页面的前一页面的 URL 地址,该值并不可信。
  22. $_SERVER['HTTP_USER_AGENT'] //当前请求的 User_Agent: 头部的内容。
  23. $_SERVER['HTTPS']//如果通过https访问,则被设为一个非空的值(on),否则返回off
  24. $_SERVER['SERVER_ADMIN'] //管理员信息。该值指明了 Apache 服务器配置文件中的 SERVER_ADMIN 参数。如果脚本运行在一个虚拟主机上,则该值是那个虚拟主机的值。
  25. $_SERVER['SERVER_PORT'] //服务器所使用的端口,默认值为 "80"。如果使用 SSL 安全连接,则这个值为用户设置的 HTTP 端口。
  26. $_SERVER['SERVER_SIGNATURE'] //包含服务器版本和虚拟主机名的字符串。
  27. $_SERVER['PATH_TRANSLATED'] //当前脚本所在文件系统(不是文档根目录)的基本路径。
  28. $_SERVER['SCRIPT_NAME'] //包含当前脚本的路径。这在页面需要指向自己时非常有用。__FILE__ 常量包含当前脚本(例如包含文件)的完整路径和文件名。
  29. $_SERVER['PHP_AUTH_USER'] //当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是用户输入的用户名。
  30. $_SERVER['PHP_AUTH_PW'] //当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是用户输入的密码。
  31. $_SERVER['AUTH_TYPE'] //当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是认证的类型
十一 06

PHP使用$_SERVER['HTTP_USER_AGENT'];获取User Agent信息,另附JS方法

PHP使用$_SERVER['HTTP_USER_AGENT'];获取User Agent信息,通过查找信息的异同并加以判断语句来实现只允许页面在微信内置浏览器打开,或只允许在手机QQ内置浏览器打开,或其它浏览器打开等。

安卓系统

手机UC浏览器:
Mozilla/5.0 (Linux; U; Android 4.2.2; zh-CN; Hol-T00 Build/HUAWEIHol-T00) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 UCBrowser/10.7.5.655 U3/0.8.0 Mobile Safari/534.30

手机QQ浏览器:
Mozilla/5.0 (Linux; U; Android 4.2.2; zh-cn; Hol-T00 Build/HUAWEIHol-T00) AppleWebKit/537.36 (KHTML, like Gecko)Version/4.0 MQQBrowser/6.1 Mobile Safari/537.36

手机QQ内置浏览器:
Mozilla/5.0 (Linux; U; Android 4.2.2; zh-cn; Hol-T00 Build/HUAWEIHol-T00) AppleWebKit/533.1 (KHTML, like Gecko)Version/4.0 MQQBrowser/5.4 TBS/025477 Mobile Safari/533.1 V1_AND_SQ_5.9.1_272_YYB_D QQ/5.9.1.2535 NetType/WIFI WebP/0.3.0 Pixel/720

微信内置浏览器:
Mozilla/5.0 (Linux; U; Android 4.2.2; zh-cn; Hol-T00 Build/HUAWEIHol-T00) AppleWebKit/533.1 (KHTML, like Gecko)Version/4.0 MQQBrowser/5.4 TBS/025478 Mobile Safari/533.1 MicroMessenger/6.3.5.50_r1573191.640 NetType/WIFI Language/zh_CN

手机百度:
Mozilla/5.0 (Linux; U; Android 4.2.2; zh-cn; Hol-T00 Build/HUAWEIHol-T00) AppleWebKit/534.24 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.24 T5/2.0 baiduboxapp/6.9.1 (Baidu; P1 4.2.2)

IOS系统

微信内置浏览器:(iPhone 4S)
Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/13B143 MicroMessenger/6.3.6 NetType/WIFI Language/zh_CN

手机QQ内置浏览器:(iPhone 4S)
Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/13B143 MicroMessenger/6.3.6 NetType/WIFI Language/zh_CN

手机QQ内置浏览器:(iPhone plus)
Mozilla/5.0 (iPhone; CPU iPhone OS 8_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12D508 QQ/5.9.1.405 Pixel/1080 NetType/WIFI Mem/132

手机QQ内置浏览器:(iPhone plus)
Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/13B143 QQ/5.9.1.405 Pixel/1080 NetType/2G Mem/208

JavaScript和PHP获取后判断信息方法如下:
Continue reading

十一 01

移动端UC /QQ 浏览器的部分私有Meta 属性

现在做WEB开发(不仅限于移动开发),都要考虑响应式布局与各种移动设备的显示效果等,国内的移动设备浏览器主要是UC浏览器和QQ浏览器为主(内核均为wekit内核),那么开发人员就必须知道一些它们的Meta私有属性,以更好的完成效果。文末有UC/QQ浏览器开发文档链接。

UC 浏览器的部分私有Meta 属性

设置屏幕方向为横屏还是竖屏

<meta name="screen-orientation" content="portrait|landscape">

设置是否全屏,yes表示强制浏览器全屏

<meta name="full-screen" content="yes">

缩放不出滚动条

<meta name="viewport" content="uc-fitscreen=no|yes"/>

设置no后用户缩放与标准浏览器缩放一直,设置为yes后,用户缩放金放到图片和文字,不出现横向滚动条。

排版

<meta name="layoutmode" content="fitscreen|standard" />

fitscreen模式简化页面处理,适合页面阅读节省流量,standard模式和标准浏览器一致;一旦设置layoutmode meta后,用户使用浏览器提供的的排版模式选项将会无效。

夜间模式

<meta name="nightmode" content="enable|disable"/>

nightmode的值设置为disable后,即使用户使用浏览器的夜间模式,页面的表现也仍然是非夜间模式。

强制图片显示

<meta name="imagemode" content="force"/>

UC浏览器为了节省流量,为用户提供了无图模式,但是如果页面的图片是必不可少的,如验证码的,需要强制浏览器显示图片,可以设置imagemode, 不影响子页面。通过META设置图片加载方式会作用于整个页面,如果希望对单个图片进行设置,那么可以使用这个

<img src="..." show="force">

应用模式

<meta name="browsermode" content="application"/>
使用了application这种应用模式后,页面讲默认全屏,禁止长按菜单,禁止收拾,标准排版,以及强制图片显示。

QQ 浏览器x5内核Meta私有属性

设置屏幕方向

<meta name="x5-orientation" content="portrait|landscape" />

设置全屏

<meta name="x5-fullscreen" content="true" />

设置屏幕模式

普通浏览模式:

<meta name="x5-page-mode" content="default" />

网页应用模式:

<meta name="x5-page-mode" content="app" />

对比

在Jeff 的实际使用的情况下,发现对于控制全屏的meta 标签,UC 跟QQ 处理的方式稍有不同:区别在于处理系统状态栏,UC 是直接覆盖系统状态栏,而QQ 仍然保留之。从原生应用的场景及用户角度看,QQ 的这种“伪全屏”反而是更为友好。

Continue reading

31

JS函数输出与获取多个返回值(实例)