PHP中的正则表达式具有带可变数字的静态字符串

时间:2019-06-26 15:35:01

标签: php sql regex

我不能把头放在正则表达式上。

假设我有这个字符串:

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之间的任何星期数。

任何建议表示赞赏。

1 个答案:

答案 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中对表达式进行说明。