【问题标题】:PHP return selected array value from preg_match() functionPHP 从 preg_match() 函数返回选定的数组值
【发布时间】:2014-04-23 08:41:47
【问题描述】:

我正在尝试获取 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 是 '8:55pm[仅限周二至周四]';

【问题讨论】:

  • 由于我在您的...帖子中看不到问题,所以我会大胆猜测并建议您使用 preg_match 的第三个参数
  • @Havelock 只有两个参数,是第二个
  • Except 何时出现在您的模式中?你的正则表达式不匹配。 stackoverflow.com/questions/23221936/…

标签: php arrays regex preg-match


【解决方案1】:

此代码给出了最后一天的名称。这意味着如果$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']];

【讨论】:

  • 如何返回代码的时间部分?也就是说, \d{1,2} : \d{2} [ap]m 部分
【解决方案2】:

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!";
   }
}

【讨论】:

  • 变量 $weekdays 是一个工作日数组,preg_match 检查它是否包含在其中的匹配模式中。我希望它返回匹配的日期。例如,如果在工作日数组中,模式匹配“星期三”,我希望它返回星期三。
【解决方案3】:

如果您花时间阅读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
} //...

【讨论】:

    猜你喜欢
    • 2017-01-26
    • 1970-01-01
    • 2013-05-15
    • 1970-01-01
    • 2011-02-21
    • 2018-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多