我不能把头放在正则表达式上。
假设我有这个字符串:
SELECT mx_posts.ID FROM mx_posts INNER JOIN mx_postmeta ON ( mx_posts.ID = mx_postmeta.post_id ) WHERE 1=1 AND (
( YEAR( mx_posts.post_date ) = 2019 AND WEEK( mx_posts.post_date, 1 ) = 26 )
) AND mx_posts.post_type = 'post'
我正在尝试查看字符串是否包含子字符串:
( YEAR( mx_posts.post_date ) = YYYY AND WEEK( mx_posts.post_date, 1 ) = WW )
其中YYYY可以是任何年份,而WW可以是介于1-52之间的任何星期数。
任何建议表示赞赏。
答案 0 :(得分:2)
该表达式将捕获我们想要捕获的内容,尽管没有必要进行数值验证,我们将首先找到匹配项,然后检查这些数字是否在期望的范围内(如果可能):
(\(\s*([0-9]{4})\(\s*mx_posts\.post_date\s*\)\s*=\s*[0-9]{4}\s+AND\s+WEEK\(\s*mx_posts\.post_date,\s*1\s*\)\s*=\s*([0-9]{1,2})\s*\))
$re = '/(\(\s*([0-9]{4})\(\s*mx_posts\.post_date\s*\)\s*=\s*[0-9]{4}\s+AND\s+WEEK\(\s*mx_posts\.post_date,\s*1\s*\)\s*=\s*([0-9]{1,2})\s*\))/s';
$str = 'SELECT mx_posts.ID FROM mx_posts INNER JOIN mx_postmeta ON ( mx_posts.ID = mx_postmeta.post_id ) WHERE 1=1 AND (
( 2012( mx_posts.post_date ) = 2019 AND WEEK( mx_posts.post_date, 1 ) = 26 )
( 2012( mx_posts.post_date ) = 2019 AND WEEK( mx_posts.post_date, 1 ) = 0 )
( 2012( mx_posts.post_date ) = 2019 AND WEEK( mx_posts.post_date, 1 ) = 53 )
) AND mx_posts.post_type = \'post\'';
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
// Print the entire match result
var_dump($matches);
如果您感兴趣,请在此demo中对表达式进行说明。