Php 从另一个字符串中获取日期和字符串
我有一堆这样的字符串,例如: 时间:22:30(25)|日期:2011年3月19日|投稿人:销售员 现在,我想在Contributor,即saller之后提取日期和字符串 目前,我正在PHP中使用Php 从另一个字符串中获取日期和字符串,php,regex,Php,Regex,我有一堆这样的字符串,例如: 时间:22:30(25)|日期:2011年3月19日|投稿人:销售员 现在,我想在Contributor,即saller之后提取日期和字符串 目前,我正在PHP中使用explode()函数 但问题是,字符串有许多变体,如: 时间:22:30(25)|日期:2011年3月19日 时间:22:30(25)|日期:2011 |投稿人:业务员 时间:22:30(25)|投稿人:业务员 时间:22:30(25)|日期:2011 我想要一种适合所有变化的完美产品。当一个字段
explode()
函数
但问题是,字符串有许多变体,如:
- 时间:22:30(25)|日期:2011年3月19日
- 时间:22:30(25)|日期:2011 |投稿人:业务员
- 时间:22:30(25)|投稿人:业务员
- 时间:22:30(25)|日期:2011
如果这个问题可以通过PHP解决的话,建议我一些解决这个问题的代码,或者一个PHP正则表达式。我想你想要这样的东西
^.*?\|\s*\K(?:Date:\s*((?:\d{2}\s*\S+)?\s*\d{4})\s*\|?)?\s*(?:Contributor:\s*(\S+))?
组索引1包含Date:
字段的值,组索引2包含Contributor:
字段的值
代码:
尝试此操作。这将只提供可用的组
见演示
您可以尝试以下方法:
$string = 'Time: 22:30 (25) | Date: 19 March 2011';
function str_func($string, $key, $remove_key = FALSE)
{
$string = trim($string);
if ($string[strlen($string) - 1] !== '|') {
$string .= '|';
}
$pos = strpos(strtolower($string), strtolower($key) . ':');
if ($pos !== FALSE) {
$return = strstr(substr($string, $pos), '|', true);
return ($remove_key) ? trim(substr($return, strlen($key) + 1)) : $return;
} else {
return NULL;
}
}
因此,只需将字符串和“Time”或“Contributor”(以及您是否希望删除密钥)传递给它即可
希望这有帮助 是否要将密钥(例如时间或参与者)与字符串一起返回?否,不需要。我可以使用数组索引来获取字符串,但它应该在任何情况下都能工作。或者
Date:\s*((?:\d{2}\s+)\d{4})Contributor:\s*(\s+)
在preg_match()中,这会引发一个错误:警告:preg_match():没有结束分隔符“^”您使用了分隔符吗?从正则表达式中删除^
,然后重试。您发布的代码不适用于此情况:时间:22:30(25)|日期:2011年3月19日|投稿人:推销员。返回空数组。这在演示中看起来不错,但当我在PHP中将它与preg_match()一起使用时,返回一个错误:警告:preg_match():分隔符不能是字母数字或反斜杠。我不知道如何编写正则表达式。@forthaction如何应用正则表达式。@forthaction'//g'$pattern='时间:.*?\\\s*(?:日期:\s*([0-9a-zA-Z]+)?\\\\s*(?:参与者:\s*([a-zA-Z0-9]+));预匹配($pattern,$str,$matches,预偏移捕获,3);打印(匹配项)@forthaction使用“//g”将模式括在/
Array
(
[0] => Array
(
[0] => Time: 22:30 (25) | Date: 19 March 2011
[1] => Time: 22:30 (25) | Date: 2011 | Contributor: Salesman
[2] => Time: 22:30 (25) | Contributor: Salesman
[3] => Time: 22:30 (25) | Date: 2011
)
[1] => Array
(
[0] => Date: 19 March 2011
[1] => Date: 2011
[2] =>
[3] => Date: 2011
)
[2] => Array
(
[0] => 19 March 2011
[1] => 2011
[2] =>
[3] => 2011
)
[3] => Array
(
[0] =>
[1] => Contributor: Salesman
[2] => Contributor: Salesman
[3] =>
)
[4] => Array
(
[0] =>
[1] => Salesman
[2] => Salesman
[3] =>
)
)
Time:.*?\|\s*(?:Date:\s*([0-9a-zA-Z ]+))?\|?\s*(?:Contributor:\s*([a-zA-Z0-9 ]+))?
$string = 'Time: 22:30 (25) | Date: 19 March 2011';
function str_func($string, $key, $remove_key = FALSE)
{
$string = trim($string);
if ($string[strlen($string) - 1] !== '|') {
$string .= '|';
}
$pos = strpos(strtolower($string), strtolower($key) . ':');
if ($pos !== FALSE) {
$return = strstr(substr($string, $pos), '|', true);
return ($remove_key) ? trim(substr($return, strlen($key) + 1)) : $return;
} else {
return NULL;
}
}
//Will return Time: 22:30 (25)
echo str_func($string, 'time');
//Will remove 'date: ' from the returned string
echo str_func($string, 'date', TRUE);