PHP正则表达式详细讲解如何提取两个字符串之间的字符(⽀持
单个多个)
开发的时候有时需要提取⼀个长字符串⾥⾯的部分字符,常⽤于变量的查询、替换等。
假如我有⼀个hiveSQL语句,需求为:将变量{@date}替换成具体的⽇期,如20200526,
select
"F" as sex,
avg(a.rate) as avgrate,
viename) as total
from
t_rating a
join t_user b on a.userid = b.userid
join t_movie c vieid = c.movieid
where
b.sex = "F"
and a.dt = {@date}
and b.dt = {@date }
group by
having
total >=50
order by
avgrate desc
limit
10;
如上SQL⾥⾯不同⽤户写{@date}的格式不同,有点⽤户写法存在部分空格如{@date },情况很多,假如我们以此列举出来很繁琐,代码执⾏效率很低,那么该如何解决呢?这个时候想到的最优解应该是利⽤强⼤的正则匹配来解决此类问题;
利⽤正则检索的⽅法,正则为:
$regex = '/\{\s*([\w\W]*?)\s*\}/';
preg_match_all($regex, $sql . " ", $matches);
正则解释:
\s*表⽰任意的空⽩符,其中*为匹配前⾯的⼦表达式零次或多次,为贪婪模式
*?⾮贪婪模式,遇到后⾯的字符后即停⽌执⾏
\w :匹配包括下划线的任何单词字符,等价于 [A-Z a-z 0-9_]
\W :匹配任何⾮单词字符,等价于 [^A-Z a-z 0-9_]
以上SQL{@date}变量替换⽇期⽅法例⼦如下:
/**
* @date⽇期变量字符串格式化
* @param  string $sql
* @param  bool  $date
* @return mixed
*/
public static function dateFormat($sql, $date = false)
{
//正则取出全部含有@date字符串的{}
$regex = '/\{\s*([\w\W]*?)\s*\}/';
preg_match_all($regex, $sql . " ", $matches);
if (!empty($matches[0])) {
foreach ($matches[0] as$string) {
if (stristr($string, '@date')) {
//去除字符串空格
$cleanString = str_replace(' ', '', $string);
//若传参$date存在,则替换变量为具体@date值
if ($date) {
if ($cleanString == '{@date}') {
$cleanString = $date;
}
$sql = str_replace($string, $cleanString, $sql);
}
正则表达式提取中文}
}
}
return$sql;
}
另外,针对于简单的单个字符串提取可以使⽤以下⽅法://提取{}⾥⾯的字符串
preg_match('/{.*}/',$sql,$match);
echo$match[0];

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。