PHP:替换数组中的所有单词

PHP:替换数组中的所有单词,php,regex,date,Php,Regex,Date,我试图用PHP解析用户输入的字符串日期。我需要删除除这两个可接受类别以外的所有字符: 1) [0-9,\./-] (numerals, comma, period, slash, and dash) 2) An array of acceptable words: $monthNames=array( "january"=>1, "jan"=>1, "february"=>2, "feb"=>2

我试图用PHP解析用户输入的字符串日期。我需要删除除这两个可接受类别以外的所有字符:

1) [0-9,\./-] (numerals, comma, period, slash, and dash)
2) An array of acceptable words:
    $monthNames=array(
        "january"=>1,
        "jan"=>1,
        "february"=>2,
        "feb"=>2
    );
我尝试对字符单词bounaries进行explode()分解,然后删除数组中不存在的每个部分,但这导致了相当混乱的局面。有没有一种优雅的方法可以做到这一点


谢谢

避免这种情况的最佳方法是将日期条目设置为只有有效选项的表单,并放弃其余选项。

您可以使用正则表达式匹配日期,下面是一个非常简单、基本的表达式:

preg_match('/((Jan|Feb|Dec|\d{1,2})[ .\/-]){2,2}\d{1,4}/i', $str, $matches);
echo $matches[0];
不过,你还得加上其他几个月

关于失眠之夜的进一步想法:

  • 不允许月份<1和>12
  • 2011年1月禁止
  • 不允许奇怪的岁月
  • 扔掉它,找一个好的;)
我将采取两步方法:

  • 提取看起来过时的东西
  • 使用内置的时间函数检查是否可以从中构建有意义的时间戳。如果不能,就把它扔掉
  • 如果可以安全地假设$monthNames数组包含的元素少于26个,那么下面的方法是有效的(尽管这绝对是一种“黑客行为”-如果我能想到值得称为“优雅”的东西,我将提供另一个答案):

    
    
    注意事项:

  • 如果要从过滤中排除26个以上的字符串,那么您可以编写代码来利用相同的想法,但在我看来,要让人类(或至少是我)理解所述代码变得相当困难
  • 当然,如果您最终决定确实需要空白,您可以调整preg_replace()模式,使其不受影响

  • 您可以使用
    strotime()

    要检查故障,请执行以下操作:

    $str = 'Not Good';
    
    // previous to PHP 5.1.0 you would compare with -1, instead of false
    if (($timestamp = strtotime($str)) === false) {
        echo "The string ($str) is bogus";
    } else {
        echo "$str == " . date('l dS \o\f F Y h:i:s A', $timestamp);
    }
    

    另外,
    DateTime::createFromFormat()
    可能会有用


    请参见

    您应该显示您的代码,以便更清楚地了解您的目标。您是否使用php的内置数组()函数
    strotime()
    strotime()需要特定的格式,这些用户输入从“1977年1月12日”到“1977年12月1日”到“1977年1月12日”到“Turkiye”的所有内容。我已经确定了大约六到七种可能是合法日期的变体。@ford:str_replace()函数将接受数组作为参数,但只接受要替换的项!我可以在片段上使用in_数组,但是我也会在数字的正则表达式中遇到麻烦。这就是为什么我没有粘贴代码的原因:从我要去的方向看,似乎没有太多可以挽救的东西,所以我希望听到一个更优雅的解决方案。这是多年来输入的数据。这不是新数据。我不确定,这是否完美地工作:如果输入字符串是“一月三日二月七日XYZ”,会发生什么?确实,您的示例演示了一个缺少的逻辑:在替换步骤之前,所有大写字母都应该去掉。修改的代码-添加了删除大写字母的初始步骤。好的,那么:如果输入字符串是
    1月3日-2月7日
    ?@Cassy-最初说明的问题不包括“一月”,因此您将(正确地)留下“2月3日7日”。现在,您可以说$monthNames数组不完整-事实就是如此。在这种情况下,正确的结果将取决于是否将“一月”作为键包含。
    echo strtotime("now"), "\n";
    echo strtotime("10 September 2000"), "\n";
    echo strtotime("+1 day"), "\n";
    echo strtotime("+1 week"), "\n";
    echo strtotime("+1 week 2 days 4 hours 2 seconds"), "\n";
    echo strtotime("next Thursday"), "\n";
    echo strtotime("last Monday"), "\n";
    
    $str = 'Not Good';
    
    // previous to PHP 5.1.0 you would compare with -1, instead of false
    if (($timestamp = strtotime($str)) === false) {
        echo "The string ($str) is bogus";
    } else {
        echo "$str == " . date('l dS \o\f F Y h:i:s A', $timestamp);
    }