PHP从preg_match()函数返回选定的数组值

时间:2014-04-23 08:41:47

标签: php arrays regex preg-match

我正在尝试获取preg_match()函数与关联数组匹配的日期的返回值,以返回选定的工作日。代码摘录如下:

$daysArray = array(
    "Monday" => "Mon", 
    "Tuesday" => "Tues", 
    "Wednesday" => "Wed", 
    "Thursday" => "Thurs", 
    "Friday" => "Fri", 
    "Saturday" => "Sat", 
    "Sunday" => "Sun"
    );
$weekdaysString = implode('|',$daysArray);

if (preg_match('/^\d{1,2}.\d{2}([ap])m\[(' . $weekdaysString . '|-).Only\]$/', $val)) {
    echo "Match was found <br />";
} else if (preg_match('/^\d{1,2}.\d{2}([ap])m\[(' . $weekdaysString . '|-)-(' . $weekdaysString . '|-).Only\]$/', $val)) {
    echo "Match was found 3<br />";
} else {
    echo 'Not found ';
}

$ val是&#39;晚上8:55 [仅限周二至周四]&#39;;

3 个答案:

答案 0 :(得分:0)

Php具有以下功能:

echo "Tomorrow is ".date("l", mktime(0, 0, 0, 4, 24, 2014)); 
//=> Tomorrow is Thursday

如果您想要检查字符串是否包含工作日,您可以执行此操作:

$daysArray = array(
    "Monday" => "Mon", 
    "Tuesday" => "Tues", 
    "Wednesday" => "Wed", 
    "Thursday" => "Thurs", 
    "Friday" => "Fri", 
    "Saturday" => "Sat", 
    "Sunday" => "Sun"
    );

$val = "The sun is warm!";

foreach($daysArray as $fullDay => $shortDay){
   if(strpos(strtolower($val), strtolower($shortDay)){
       echo "match on $fullDay!";
   }
}

答案 1 :(得分:0)

如果您花时间阅读preg_matchpreg_match_all上的文档,您会发现它能够找到匹配并且不仅会返回一个布尔值值。

使用这些新知识,您可以使用匹配项在您评估的字符串中查找工作日。

试试这个:

$matches = array();
if (preg_match_all('/^\d{1,2}.\d{2}([ap])m\[(' . $weekdaysString . '|-).Only\]$/', $val, $matches)) {
    echo "Match was found <br />";
    // check the array $matches here
} //...

答案 2 :(得分:0)

此代码提供最后一天的名称。这意味着如果$val仅包含一天,则会显示此日期。您可以通过删除$val轻松更改此行为,以便在?包含两天时仅获得结果。如果您想处理更多天数,请将?替换为*

我认为翻转关联数组,在结尾处获取日期名称以及使用array_keys构建日子模式($dayPat)更有用。

$val = '8:55pm[Tues-Thurs Only]';

$daysCorr = array(
    'Mon'   => 'Monday',
    'Tues'  => 'Tuesday',
    'Wed'   => 'Wednesday',
    'Thurs' => 'Thursday',
    'Fri'   => 'Friday',
    'Sat'   => 'Saturday',
    'Sun'   => 'Sunday');

$dayPat = implode('|', array_keys($daysCorr));

$pattern = <<<EOD
~
^
  \d{1,2} : \d{2} [ap]m
  \[
  (?:
      (?: $dayPat )     # first day  
      (?: - | [ ]&[ ] ) # day delimiter
  )?                    # ? makes the first day optional, remove it if not needed
  (?<day> $dayPat )
  [ ]                   # Since the x modifier is used (free space mode),
                        # you must use [ ] to write a literal space 
  Only ]
\z                      # end of the string
~x
EOD;

if (preg_match($pattern, $val, $match))
    echo $daysCorr[$match['day']];