微信小程序数据分析之自定义分析

在小程序后台,微信已经提供了强大的数据分析功能,包括实时统计、访问分析、来源分析和用户画像功能,可以说对一般的数据分析已经完全足够了,但有时应用需要做一些更加精准的数据分析,比如具体到某一个页面的分享,页面中某一个button的点击等,这时候就需要用到自定义分析功能。

什么是自定义分析?

引用下官方文档:

自定义分析支持灵活多维和近实时的用户行为分析,可以通过自定义上报,对用户在小程序内的行为做精细化跟踪,满足页面访问等标准统计以外的个性化分析需求。

Read More

部分语言URL正则匹配

开发中,经常会需要做一些正则匹配,比如手机号验证,email验证,URL匹配等,写此篇文章主要是记录如何使用正则表达式匹配URL,方便以后再遇到此问题时不必到处搜索而得不到满意的答案。

PHP(使用preg_match)

1
%^(?:(?:https?|ftp)://)(?:\S+(?::\S*)[email protected]|\d{1,3}(?:\.\d{1,3}){3}|(?:(?:[a-z\d\x{00a1}-\x{ffff}]+-?)*[a-z\d\x{00a1}-\x{ffff}]+)(?:\.(?:[a-z\d\x{00a1}-\x{ffff}]+-?)*[a-z\d\x{00a1}-\x{ffff}]+)*(?:\.[a-z\x{00a1}-\x{ffff}]{2,6}))(?::\d+)?(?:[^\s]*)?$%iu

PHP(使用validate filter)

1
if (filter_var($url, FILTER_VALIDATE_URL) !== false)...

Python

1
http[s]?://(?:[a-zA-Z]|[0-9]|[[email protected]&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+

Javascript

1
/((([A-Za-z]{3,9}:(?:\/\/)?)(?:[\-;:&=\+\$,\w][email protected])?[A-Za-z0-9\.\-]+|(?:www\.|[\-;:&=\+\$,\w][email protected])[A-Za-z0-9\.\-]+)((?:\/[\+~%\/\.\w\-_]*)?\??(?:[\-\+=&;%@\.\w_]*)#?(?:[\.\!\/\\\w]*))?)/

HTML5

1
<input type="url" />

匹配上面input输入的URL(RFC3986

1
^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?

Perl

1
^(((ht|f)tp(s?))\://)?(www.|[a-zA-Z].)[a-zA-Z0-9\-\.]+\.(com|edu|gov|mil|net|org|biz|info|name|museum|us|ca|uk)(\:[0-9]+)*(/($|[a-zA-Z0-9\.\,\;\?\'\\\+&%\$#\=~_\-]+))*$

Ruby

1
/\A(?:(?:https?|ftp):\/\/)(?:\S+(?::\S*)[email protected])?(?:(?!10(?:\.\d{1,3}){3})(?!127(?:\.\d{1,3}){3})(?!169\.254(?:\.\d{1,3}){2})(?!192\.168(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})))(?::\d{2,5})?(?:\/[^\s]*)?\z/i

Go (使用govalidator.IsURL)

1
2
3
4
5
6
7
8
9
10
package main
import (
"fmt"
"github.com/asaskevich/govalidator"
)
func main() {
str := "http://www.urlregex.com"
validURL := govalidator.IsURL(str)
fmt.Printf("%s is a valid URL : %v \n", str, validURL)
}

Objective-C

1
(http|https)://((\\w)*|([0-9]*)|([-|_])*)+([\\.|/]((\\w)*|([0-9]*)|([-|_])*))+

Swift

1
((?:http|https)://)?(?:www\\.)?[\\w\\d\\-_]+\\.\\w{2,3}(\\.\\w{2})?(/(?<=/)(?:[\\w\\d\\-./_]+)?)?

定义一个函数方法:

1
2
3
4
5
func canOpenURL(string: String?) -> Bool {
let regEx = "((https|http)://)((\\w|-)+)(([.]|[/])((\\w|-)+))+"
let predicate = NSPredicate(format:"SELF MATCHES %@", argumentArray:[regEx])
return predicate.evaluateWithObject(string)
}

使用:

1
2
3
4
5
if canOpenURL("http://www.urlregex.com") {
print("valid url.")
} else {
print("invalid url.")
}

Swift (使用官方提供的canOpenURL)

1
UIApplication.sharedApplication().canOpenURL(urlString)

Java

1
^(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]

VB.NET

1
(http(s)?://)?([\w-]+\.)+[\w-]+[.com]+(/[/?%&=]*)?

C

1
^(ht|f)tp(s?)\:\/\/[0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*(:(0-9)*)*(\/?)([a-zA-Z0-9\-\.\?\,\'\/\\\+&%\$#_]*)?$

MySQL

1
2
3
SELECT field FROM table 
WHERE field
REGEXP "^(https?://|www\\.)[\.A-Za-z0-9\-]+\\.[a-zA-Z]{2,4}

整理自:http://urlregex.com

解决PHP中htmlspecialchars返回null的问题

在开发中,经常需要对用户传过来的数据进行过滤,来阻止一些用户的恶意输入,在PHP中常用到htmlspecialchars()htmlentities()strip_tags()函数来处理。

今天在使用htmlspecialchars()做特殊字符的转换时,一直返回null,当我换成htmlentities()也是同样的问题,查官方手册才发现原来是编码的问题。

函数声明:

问题主要处在第三个参数上,对于第三个参数官方是这么说的:

这个参数的作用是设置转换字符时采用的编码,在PHP 5.4 和5.5中使用了UTF-8作为默认编码,而在PHP 5.4之前使用ISO-8859-1作为默认编码,从PHP 5.6开始就使用PHP配置文件中的default_charset参数作为默认编码。encoding参数支持的字符集:

从PHP的更新日志也能看到这个参数的变化:

一般我们是这么使用的:

1
2
3
$str='<a href="test.html">\'测试页面\'</a><script>alert(213)</script>';
echo htmlspecialchars($str);
// 输出:&lt;a href=&quot;test.html&quot;&gt;'测试页面'&lt;/a&gt;&lt;script&gt;alert(213)&lt;/script&gt;

今天在使用的时候,结果一直返回null,其实就是编码的问题,这个时候就需要用到第三个参数了:

1
echo htmlspecialchars($string, ENT_COMPAT,'ISO-8859-1', true);

同样,也适用于htmlentities

1
echo htmlentities($string, ENT_COMPAT,'ISO-8859-1', true);