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

PHP中的正则表达式,具有带可变数字的静态字符串,php,sql,regex,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 = 'p

我不能把我的头缠在正则表达式上

假设我有这个字符串:

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之间的任何周数


感谢您的建议。

此表达式将捕获我们希望捕获的内容,虽然不需要进行数字验证,但我们会首先找到匹配项,然后检查这些数字是否符合我们的期望范围,如果可能:

(\(\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*\))
测验
在这里,如果您可能感兴趣,将对表达式进行解释。

您能否给出一个需要处理的字符串示例,因为此时它似乎只是在检查某种类型的日期。当然可以。请稍等,我加了进一步的说明。这更有意义吗?
YYYY
可以与
\d{4}
匹配,这将是任何4位数字(不是严格的测试,被授予),而
WW
可以是
[1-5]?[0-9]
(假设没有前导零)
$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);