正则表达式匹配字符串与变量

时间:2014-05-12 08:39:11

标签: php regex

试图找出一个reg ex,例如,这个字符串:

*/30 * * * * http://www.domain.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1

我需要捕获*/30 * * * *的开始/wp-cron.php?doing_wp_cron >/dev/null 2>&1和结束值*/30 * * * *,但这些值之间的关系并不重要。

此外,0 * * * *的开头部分有时也可以是这些值:

0 0 * * * 要么 ^\*\/30 [\*].+\s[*4]

在这种情况下,我也需要一个正则表达式,或者,如果一个人可以做到这一切,那将是伟大的!如果重要的话,开头部分实际上是在字符串变量中。可以是以上任何值。

我该怎么做?

到目前为止,我有类似这样的事情:site_url()

但是我的正则表达式技巧很渺茫,而且只匹配开头...需要匹配结束,如果有办法将site_url()放入正则表达式,我们可以匹配整条线,这将是首选。

修改

好的,所以有一个这样的变量:http://www.domain.com,这将返回字符串中的WordPress博客网站网址,如下所示:$updateinterval

现在,还有一个名为*/30 * * * *的变量,它将包含任何字符串值:0 * * * *0 0 * * *$cron_job = $updateinterval . ' ' . site_url() . '/wp-cron.php?doing_wp_cron >/dev/null 2>&1';

现在,我从这些变量构建一个字符串,如下所示:

$cron_job

它比使用它在PHP中插入一个Cron作业(据说)。但是,为了删除cron作业(因此如果不再需要它就进行清理),我需要使用正则表达式来查找cron作业的行,并编辑删除它所需的文件。

现在,我可以随时获得$ cron_job中设置的全部字符串,甚至是之前设置的内容。因此,在这种情况下,如果可以将整个字符串$updateinterval与正则表达式匹配,那就是最好的。但是,如何在正则表达式中使用这些变量site_url()preg_grep

所以,我有一个使用*/30 * * * * http://www.domain.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1 0 * * * * http://www.domain.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1 0 0 * * * http://www.domain.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1 的类来删除正在设置cron作业的行。但是如何使用它来匹配变量中的所有可能值?或者只是抓住开始和结束常量?无论哪种方式都适合我。

*重新编辑* 因此,例如,它需要在文件中搜索,如果找到任何文件(REGEX),那么它就是匹配项,并且将被cron作业删除:

//我们只是说为了这个原因,site_url()解析为:http://www.domain.com。这在每个站点的基础上会有所不同。

site_url()

除了上面3个字符串之外的任何其他内容都应该失败!所以正则表达式应该只匹配上面给出的3个字符串,就是这样。也就是说,无论{{1}}是什么,如果可能的话,它应该将它添加到正则表达式。

2 个答案:

答案 0 :(得分:2)

继续你的第三次重新编辑,如果你想要那么具体,它真的很容易:

^((\d|\*(/\d{1,2})?)\s){5}http://www.\S+/.+doing_wp_cron\s>/dev/null\s2>&1$

但这实际上取决于您希望获得的具体方式,我会将\S+组替换为大部分内容,但这取决于您,(例如/dev/null以及2>&1部分)但我根据您的要求尽可能限制了它。以下是匹配的

*/30 * * * * http://www.domain.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1
0 * * * * http://www.domain.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1
0 0 * * * http://www.domain.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1

see here

答案 1 :(得分:1)

那么,这是我的方法:

$pattern = '~^(?:\*/30\s\*|0\s[*0])(?:\s\*){3}\s'.preg_quote(site_url(),"~").'~';

第一部分应仅匹配案例:*/30 * * * *0 * * * *0 0 * * *

使用(?:非捕获组进行更改,(?:\s\*){3}匹配* * *

随后是site_url()输出。所以,只需匹配它:

$arr_input = array(
"*/30 * * * * http://www.testing.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1",
"0 * * * * http://www.domain.com/bar.php?doing_wp_cron >/dev/null 2>&1",
"0 * * * * http://www.a.test/b.php?doing_wp_cron >/dev/null 2>&1",
"*/30 * * * * http://www.domain.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1",
"0 * * * * http://www.domain.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1",
"0 0 * * * http://www.domain.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1");

foreach($arr_input AS $v)
{
  if(preg_match($pattern, $v)) {
    echo "MATCH: ".$v."\n";
  } else {
    echo "FAIL: ".$v."\n";
  }
}

Test,另见SO Regex FAQ