Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP explode()中是否允许使用通用字符_Php_Regex - Fatal编程技术网

PHP explode()中是否允许使用通用字符

PHP explode()中是否允许使用通用字符,php,regex,Php,Regex,我需要在“2012年5月27日星期日上午6:25”之前拿到所有东西 我希望在“在xxx,xxx,xx在xx:xx,” 这里的问题是5月、27日和6日的长度都是可变的。这项工作的最佳工具是什么。由于我缺乏使用正则表达式的经验,我正在尝试使用explode(),但它似乎无法在这里完成这项工作。regex是我最好的选择吗 [编辑] $to = "Let me know how this response looks..... On Sun, May 27, 2012 at 6:25 AM, Pr";

我需要在“2012年5月27日星期日上午6:25”之前拿到所有东西

我希望在“在xxx,xxx,xx在xx:xx,”

这里的问题是5月、27日和6日的长度都是可变的。这项工作的最佳工具是什么。由于我缺乏使用正则表达式的经验,我正在尝试使用explode(),但它似乎无法在这里完成这项工作。regex是我最好的选择吗

[编辑]

$to = "Let me know how this response looks..... On Sun, May 27, 2012 at 6:25 AM, Pr";
preg_match("/On\s+(Sun|Sat|Fri|Thu|Wed|Tue|Mon),\s+(January|February|March|April|May|June|July|August|September|October|November|December)\s+\d?\d,\s+\d{4}\s+at\s+\d?\d:\d\d\s+[AP]M,/i", $to, $end);
我最终使用了一组答案。我同意:


赛前比赛(“/(*)在星期一(星期日、星期六、星期五、星期四、星期三、星期二、星期一),\s+(一月、二月、三月、四月、五月、六月、七月、八月、九月、十月、十一月、十二月)s+\d、\s+\d\s+at\s+\d\d\d\s:\d\d\s+\d\s+\d\d\s+\d\s+\d\d\d\s:$M结束)

我想是这样的:

/On\s+(Sun|Sat|Fri|Thu|Wed|Tue|Mon),\s+(January|February|March|April|May|June|July|August|September|October|November|December)\s+\d?\d,\s+\d{4}\s+at\s+\d?\d:\d\d\s+[AP]M,/i
[编辑]

$to = "Let me know how this response looks..... On Sun, May 27, 2012 at 6:25 AM, Pr";
preg_match("/On\s+(Sun|Sat|Fri|Thu|Wed|Tue|Mon),\s+(January|February|March|April|May|June|July|August|September|October|November|December)\s+\d?\d,\s+\d{4}\s+at\s+\d?\d:\d\d\s+[AP]M,/i", $to, $end);
根据注释:我添加了对不区分大小写的支持(通过在正则表达式的末尾添加
I
修饰符)。我还将表达式中的空格改为
\s
以允许任何空格字符,并添加了
+
以允许单词之间的多个空格

我没有将其更改为支持长日名称或短月名称,因为问题指定月名称的长度是可变的,但没有指定日名称为可变的。然而,如果需要的话,添加这些变体应该足够简单

[编辑]

$to = "Let me know how this response looks..... On Sun, May 27, 2012 at 6:25 AM, Pr";
preg_match("/On\s+(Sun|Sat|Fri|Thu|Wed|Tue|Mon),\s+(January|February|March|April|May|June|July|August|September|October|November|December)\s+\d?\d,\s+\d{4}\s+at\s+\d?\d:\d\d\s+[AP]M,/i", $to, $end);
此代码适用于注释中给出的示例


希望能有所帮助。

我想是这样的:

/On\s+(Sun|Sat|Fri|Thu|Wed|Tue|Mon),\s+(January|February|March|April|May|June|July|August|September|October|November|December)\s+\d?\d,\s+\d{4}\s+at\s+\d?\d:\d\d\s+[AP]M,/i
preg_match('/(.*?) On \w+, \w+ \d?\d, \d+ at \d?\d:\d?\d \w\w,/', 'grab this text here On Sun, May 27, 2012 at 6:25 AM,', $matches);
echo $matches[1];
// echoes 'grab this text here'
[编辑]

$to = "Let me know how this response looks..... On Sun, May 27, 2012 at 6:25 AM, Pr";
preg_match("/On\s+(Sun|Sat|Fri|Thu|Wed|Tue|Mon),\s+(January|February|March|April|May|June|July|August|September|October|November|December)\s+\d?\d,\s+\d{4}\s+at\s+\d?\d:\d\d\s+[AP]M,/i", $to, $end);
根据注释:我添加了对不区分大小写的支持(通过在正则表达式的末尾添加
I
修饰符)。我还将表达式中的空格改为
\s
以允许任何空格字符,并添加了
+
以允许单词之间的多个空格

我没有将其更改为支持长日名称或短月名称,因为问题指定月名称的长度是可变的,但没有指定日名称为可变的。然而,如果需要的话,添加这些变体应该足够简单

[编辑]

$to = "Let me know how this response looks..... On Sun, May 27, 2012 at 6:25 AM, Pr";
preg_match("/On\s+(Sun|Sat|Fri|Thu|Wed|Tue|Mon),\s+(January|February|March|April|May|June|July|August|September|October|November|December)\s+\d?\d,\s+\d{4}\s+at\s+\d?\d:\d\d\s+[AP]M,/i", $to, $end);
此代码适用于注释中给出的示例

希望有帮助

preg_match('/(.*?) On \w+, \w+ \d?\d, \d+ at \d?\d:\d?\d \w\w,/', 'grab this text here On Sun, May 27, 2012 at 6:25 AM,', $matches);
echo $matches[1];
// echoes 'grab this text here'
(.*)
匹配开头的所有字符,
\w+
匹配任何字母数字字符1次或多次,
\d?\d
匹配一位或两位数字


(.*?)
匹配开始时的所有内容,
\w+
匹配任何字母数字字符1次或多次,
\d?\d
匹配一个或两个数字,因为正则表达式就是为了:基于模式选择数据而设计的。然而,你可以在“,”(逗号)上爆炸,然后将前4个元素再次内爆,形成你的句子。我怀疑在这种情况下使用正则表达式会更快

归根结底,这是你的偏好:你更容易阅读和理解。 在这种特殊情况下,正则表达式的主要优点是它们可以提取特定的值/模式,因此您可以轻松地将它们放在月份之外

$dateString = "On Sun, May 27, 2012 at 6:25 AM, some other text here";

// using explode/implode
$result = explode(',',$dateString);

print "we got: " . implode(',', array_slice($result,0,3)) . "\n";

// using regular expression
$pattern = "/On [A-Z,a-z]{3}, [A-Z,a-z]{3} [0-9]+, [0-9]{4} at [0-9,:]+ (?:A|P)M/U";

preg_match($pattern,$dateString,$match);

print "We got: " . $match[0] . "\n";
请同时阅读本手册并附上首字母


就我个人而言,在这种情况下,我认为reg exp在视觉上和性能上都可能有些过分。不过,一定要学习正则表达式,它们有时会非常有用。

正则表达式可以工作,因为它就是用来:根据模式选择数据的。然而,你可以在“,”(逗号)上爆炸,然后将前4个元素再次内爆,形成你的句子。我怀疑在这种情况下使用正则表达式会更快

归根结底,这是你的偏好:你更容易阅读和理解。 在这种特殊情况下,正则表达式的主要优点是它们可以提取特定的值/模式,因此您可以轻松地将它们放在月份之外

$dateString = "On Sun, May 27, 2012 at 6:25 AM, some other text here";

// using explode/implode
$result = explode(',',$dateString);

print "we got: " . implode(',', array_slice($result,0,3)) . "\n";

// using regular expression
$pattern = "/On [A-Z,a-z]{3}, [A-Z,a-z]{3} [0-9]+, [0-9]{4} at [0-9,:]+ (?:A|P)M/U";

preg_match($pattern,$dateString,$match);

print "We got: " . $match[0] . "\n";
请同时阅读本手册并附上首字母


就我个人而言,在这种情况下,我认为reg exp在视觉上和性能上都可能有些过分。不过,一定要学习正则表达式,它们有时会非常有用。

为什么不将strotime()与date()结合使用呢?我仍然不明白您要做什么。在一个充满值的字符串中,“before”在哪里?很抱歉,不够清晰。我正在尝试解析来自外部服务器的电子邮件,该服务器向我的脚本发送$u POST密钥。我需要回复信息,但与原始信息有误。我认为获得回复消息的唯一方法是在我上面所说的内容之前抓取所有内容。因此,您有一个这样的数据集“2012年5月27日星期日上午6:25分的XXXXXXXXX”,并且您希望获得XXXXXXXXXX?为什么不将strotime()与date()结合使用?我仍然不明白您在尝试做什么。问题在哪里“以前“在一个充满值的字符串中?很抱歉不够清晰。我正在尝试解析来自外部服务器的电子邮件,该服务器向我的脚本发送$u POST密钥。我需要回复信息,但与原始信息有误。我认为获得回复消息的唯一方法是在我上面所说的内容之前抓取所有内容。因此,您有这样一个数据集“XXXXXXXXX On Sun,2012年5月27日上午6:25”,并且您希望获得XXXXXXXXX?您应该支持:简短和全名(
Sun
Sunday
Jan
janur
),大写/小写和多个空格。@bsdnoobz-我是在回答特定的问题,没有提供通用的日期正则表达式。星期几不是他指定为可变长度的字段之一,所以我假设它固定为三个字符。相反,虽然“May”在这一点上可能是不明确的,但是月份被指定为可变长度,因此我提供了完整的月份名称。问题中也没有提到空格,所以我假设它是固定的(如果他从一个特定的来源获得输入,很可能会是固定的)。@bsdnoobz-我用一些y编辑了答案