php正则基础
匹配模块必须以 / / 开始和结束,第二个 / 后可以加模式修正符
原子
①a-z A-Z _ 0-9 //最常见的字符
②(abc) //用圆括号括起来起来的单元符号
③[abcs] [^abd] //用方括号括起来的原子表,
原子表中的^代表排除或相反内容。
\D 除所有数字外[^0-9]
\w 包含所有英文字符[a-zA-Z_0-9]
\W 除所有英文字符外[^a-zA-Z_0-9]
\s 包含空白区域如回车、换行、分页等 [\f\n\r]
元字符
+ 1次或多次
? 0次或1次
. 代表任意一个字符(除了回车换行)
| 相当与php的 || (“或”的意思)
^ 强制匹配字符串首部内容
$ 强制匹配字符串尾部内容
[^abc] 匹配除了a或b或c之外的内容
\b 匹配单词边界,边界可以是空格或者特殊符号
\B 匹配除带单词边界以外的内容
{m} 匹配前一个内容的重复次数为M次
{m,} 匹配前一个内容的重复次数大于等于M次
{m,n} 匹配前一个内容的重复次数M次到N次
( ) 整体匹配,并放入内存,可使用\\1 或 \\2 …依次获取
优先级:依次降低
* ? + { } 重复匹配内容其次
^ $ \b 边界处理第三
| 条件处理第四
最后按照运算顺序计算匹配
常用修正符: $mode = "/正则/U";
i 正则内容在匹配时候不区分大小写(默认是区分的)
m 在匹配首内容或者尾内容时候采用多行识别匹配
S 将回车转化为空格
x 忽略正则中的空白
A 强制从头开始匹配
D 强制$匹配尾部无任何内容 \n
U 禁止贪婪匹配,只跟踪到最近的一个匹配符并结束,常用在采集程序上的正则表达式
应用
preg_match_all ( string pattern, string subject, array matches [, int flags] )
截取比较详细的内容,采集网页,分析文本
preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit] )
preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit] )
提示 1、替换内容可以是一个正则也可以是数组正则
2、替换内容可以通过修正符e来解决替换执行内容
preg_split ( string pattern, string subject [, int limit [, int flags]] )
通过正则表达式来切割相关内容,类似之前学过的explode()切割函数,但explode
只能按照一种方式切割有局限性。
例子:
$mode = "/^[a-z][-_\.]?[a-z\d]*@[a-z0-9]+[\.][a-z]{2,4}/i";
$str = a12345@;
echo $str.'<hr>';
if(preg_match($mode, $str, $arr)){
echo 'succeed -- <font color=red>'.$arr[0];
}else{
echo 'failed';
}
?>
手机号码:
邮箱地址:
完整代码如下:
/**
* function getmxrr
* 获取指定域名的MX记录信息
* edit www.
*/
function win_getmxrr($hostname, &$mxhosts, &$mxweight=false)
{
if (strtoupper()(substr(PHP_OS, 0, 3)) != 'WIN') return;
if (!is_array ($mxhosts) ) $mxhosts = array();
if (empty($hostname)) return;
$exec='nslookup -type=MX '.escapeshellarg($hostname);
@exec($exec, $output);
if (empty($output)) return;
$i=-1;
foreach ($output as $line) {
$i++;
if (preg_match("/^$hostname\tMX preference = ([0-9]+), mail exchanger = (.+)$/i", $line, $parts)) {
$mxweight[$i] = trim($parts[1]);
$mxhosts[$i] = trim($parts[2]);
}
if (preg_match('/responsible mail addr = (.+)$/i', $line, $parts)) {
$mxweight[$i] = $i;
$mxhosts[$i] = trim($parts[1]);
}
}
return ($i!=-1);
}
if (!function_exists('getmxrr')) {
function getmxrr($hostname, &$mxhosts, &$mxweight=false) {
return win_getmxrr($hostname, $mxhosts, $mxweight);
}
}
/**
* class EmailLinker
* 邮箱验证类,正则匹配邮箱地址并对域名是否有MX解析进行验证
*/
class EmailLinker
{
CONST CONN_TIMEOUT = 10;
CONST READ_TIMEOUT = 5;
CONST SMTP_PORT = 25;
private $email;
function __construct($email)
{
$this->email = $email;
$this->redirectIfNeeded();
}
//重定向邮箱地址
function redirectIfNeeded()
{
if(array_key_exists('mail',$_GET) && $this->email == base64_decode($_GET['mail']) ){
header('Location: mailto:'.$this->email);
exit;
}
}
//回调返回邮箱地址
public function link()
{
if($this->isValid()){
$encoded = base64_encode($this->email);
return '<a href="/blog_article/mail/.html'.urlencode($encoded).'" target="_blank">Email:'.$this->email.'</a>';
}
}
//获取邮箱地址并验证
public function isValid($mail = '')
{
static $valid = null;
if($mail){
return ( $this->getParts() != null );
}
if($valid !== null){
return $valid;
}
if($parts = $this->getParts()){
$valid = $this->validateUser($parts['host'],$parts['user']);
}
return $valid;
}
private function validateUser($hostname,$user)
{
if($sock = $this->openSMTPSocket($hostname)){
$this->smtpSend($sock,"HELO $hostname");
$resp = $this->smtpSend($sock,"MALL FROM: <$user@$hostname>");
//$resp = $this->smtpSend($sock,"RCPT TO:<$user@$hostname>"); //这一步可能被ISP过滤了,导致邮箱验证不成功
$vaild = (preg_match('/250|451|452\s/',$resp) == 1);
fclose($sock);
return $vaild;
}else{
return false;
}
}
private function openSMTPSocket($hostname)
{
$hosts = $this->getMX($hostname);
foreach($hosts as $host => $weight)
{
if($sock = @fsockopen($host,self::SMTP_PORT,$errno,$errstr,self::CONN_TIMEOUT))
{
stream_set_timeout($sock,self::READ_TIMEOUT);
return $sock;
}
}
}
private function getMX($hostname)
{
$host = array();
$weights = array();
getmxrr($hostname,$hosts,$weights);
$results = array();
foreach($hosts as $i => $host)
{
$results[$host] = $weights[$i];
}
arsort($results,SORT_NUMERIC);
$results[$hostname] = 0;
return $results;
}
private function smtpSend($sock,$data)
{
fwrite($sock,"$data\r\n");
return fgets($sock,1024);
}
//正则匹配
private function getParts()
{
//$emailRegex = '/\w+([-+.]\w+)*@\w+([-.]\w)*\.\w+([-.]\w+)*/x';
$emailRegex = <<<__REGEX__
/(?P<user>
\w+([-+.]\w+)*
)@(?P<host>
\w+([-.]\w)*\.\w+([-.]\w+)*
)/x
__REGEX__;
return (preg_match($emailRegex,$this->email,$matches))? $matches : null ;
}
}
$emailLinker_class = new EmailLinker('790896688@qq.com');
echo $emailLinker_class->link();
?>
您可能感兴趣的文章:
php邮箱检测的正则表达式一例
php正则验证email邮箱及抽取内容中email的例子
php常用正则表达式(日期 电话 中文 邮箱等)
php写的用来检测手机邮箱用户名的类
验证用户输入的邮箱有效性与正确性的php代码
1,匹配中文字符的正则表达式: [u4e00-u9fa5]
说明:匹配中文还真是个头疼的事,有了这个表达式就好办了
2,匹配双字节字符(包括汉字在内):[^x00-xff]
说明:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)
3,匹配空白行的正则表达式:ns*r
说明:可以用来删除空白行
4,匹配HTML标记的正则表达式: <(S*?)[^>]*>.*? </1> | <.*? />
说明:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力
5,匹配首尾空白字符的正则表达式:^s* |s*$
说明:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式
6,匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*
说明:表单验证时很实用
7,匹配网址URL的正则表达式:[a-zA-z]+://[^s]*
说明:网上流传的版本功能很有限,上面这个基本可以满足需求
8,匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
说明:表单验证时很实用
9,匹配国内电话号码:d{3}-d{8} |d{4}-d{7}
说明:匹配形式如 0511-4405222 或 021-87888822
10,匹配腾讯QQ号:[1-9][0-9]{4,}
说明:腾讯QQ号从10000开始
11,匹配中国邮政编码:[1-9]d{5}(?!d)
说明:中国邮政编码为6位数字
12,匹配身份证:d{15} |d{18}
说明:中国的身份证为15位或18位
13,匹配ip地址:d+.d+.d+.d+
说明:提取ip地址时有用
14,匹配特定数字:
^-[1-9]d*$ //匹配负整数
^-?[1-9]d*$ //匹配整数
^[1-9]d* |0$ //匹配非负整数(正整数 + 0)
^-[1-9]d* |0$ //匹配非正整数(负整数 + 0)
^[1-9]d*.d* |0.d*[1-9]d*$ //匹配正浮点数
^-([1-9]d*.d* |0.d*[1-9]d*)$ //匹配负浮点数
^-?([1-9]d*.d* |0.d*[1-9]d* |0?.0+ |0)$ //匹配浮点数
^[1-9]d*.d* |0.d*[1-9]d* |0?.0+ |0$ //匹配非负浮点数(正浮点数 + 0)
^(-([1-9]d*.d* |0.d*[1-9]d*)) |0?.0+ |0$ //匹配非正浮点数(负浮点数 + 0)
说明:处理大量数据时有用,具体应用时注意修正
15,匹配特定字符串:
^[A-Z]+$ //匹配由26个英文字母的大写组成的字符串
^[a-z]+$ //匹配由26个英文字母的小写组成的字符串
^[A-Za-z0-9]+$ //匹配由数字和26个英文字母组成的字符串
^w+$ //匹配由数字、26个英文字母或者下划线组成的字符串
16,PHP正则匹配日期
$hour = rand(10,23);
$hour = (strlen($hour)>1) ? $hour : "0{$hour}";
print_r(preg_replace('/(\d+)-(\d+)-(\d+) (\d+)/', '${1}-${2}-${3} '.$hour, $subject));
就介绍这些了,挺实用的php正则匹配格式,需要的时候打开看看,说不定可以帮上大忙。
您可能感兴趣的文章:
php邮箱检测的正则表达式一例
php正则验证email邮箱及抽取内容中email的例子
php邮箱验证类及正则匹配域名验证的实例代码
php写的用来检测手机邮箱用户名的类
验证用户输入的邮箱有效性与正确性的php代码