gpt4 book ai didi

php - 从头开始匹配字符串的一部分

转载 作者:可可西里 更新时间:2023-10-31 22:52:14 25 4
gpt4 key购买 nike

我有一个日期(例如 yyyy-mm-dd hh:mm:ss),如果我们有一个字符串完全匹配或部分匹配该模式,我希望能够从头开始返回 true结束。例如。 44 会匹配模式,因为 44 会匹配 yy 但 -12 不会匹配,因为 - 不是一个有效的“y”字符。

我想到了一些不雅的解决方案。我可以对这样的东西进行 preg_match:

#^\d(\d(\d(\d(-)?)?)?)?$#

这只是根据年份执行部分匹配。它需要扩展以说明月、日、小时、分钟等,但这应该表明想法 # 1。

我也可以做类似...

$patterns = [
'',
'\d',
'\d\d',
'\d\d\d',
'\d\d\d\d',
'\d\d\d\d-',
...
];
isset($patterns[strlen($str)] && preg_match('#^' . $patterns[strlen($str)] . '$#', $str)

但这也有点令人费解。

我也可以这样做:

switch (strlen($str)) {
case 1: return preg_match('#^\d$#', $str);
case 2: return preg_match('#^\d\d$#', $str);
case 3: return preg_match('#^\d\d\d$#', $str);
case 4: return preg_match('#^\d\d\d\d$#', $str);
case 5: return preg_match('#^\d\d\d\d-$#', $str);
...
}

但这看起来也很臃肿。

换句话说,我正在寻找 2005- 将返回 true 的函数,22005-1 也是如此.但是 -2005 将返回 false,205-neubert 也是如此。

我希望能够将有效值传递到 SQL 查询中。例如。 WHERE date_column LIKE '$str%'。如果 date_column 是 DATETIME,那么搜索 -12- 就是浪费时间,因为 date_column 不可能将其作为值。

有什么想法吗?

最佳答案

像这样的东西应该可以工作:

function doesMatch($str) {
// The date pattern split so that each array entry matches exactly one character
$pattern_chunks = array(
'\d', '\d', '\d', '\d', '-',
'\d', '\d', '-',
'\d', '\d',
'\s',
'\d', '\d', ':',
'\d', '\d', ':',
'\d', '\d'
);

$chunk_count = count($pattern_chunks);
$str_len = strlen($str);

// If the string is empty, it's clearly not a date
if ( $str_len < 1 ) { return false; }

// If the string is longer than our pattern chunks, there's no way it matches
if ( $str_len > $chunk_count ) { return false; }

// Make a pattern using the first N chunks of our pattern parts
$pattern = '^' . implode('', array_slice($pattern_chunks, 0, $str_len)) . '$';

// Return if the string matches
return (preg_match($pattern, $str) > 0);
}

例如,您的输入字符串有 6 个字符长,它只使用日期模式的前 6 个 block (^\d\d\d\d-\d$)。

关于php - 从头开始匹配字符串的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37279585/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com