Php 删除字符串中的所有内容,具有特定模式的日期除外
我试图从foreach中从数据库获取的字符串中删除除日期(dd-mm-yyyy)以外的所有内容 我本可以删除所有文本([A-Z][A-Z]等),但文本之间也有数字Php 删除字符串中的所有内容,具有特定模式的日期除外,php,regex,preg-replace,preg-match,Php,Regex,Preg Replace,Preg Match,我试图从foreach中从数据库获取的字符串中删除除日期(dd-mm-yyyy)以外的所有内容 我本可以删除所有文本([A-Z][A-Z]等),但文本之间也有数字 $strings = [ 'Originele startdatum ', 'Op verzoek van klant de ingangsdatum gelijkgetrokken met alle andere abonnementen zodat er maar 1 factuur wordt verstuurd
$strings = [
'Originele startdatum ',
'Op verzoek van klant de ingangsdatum gelijkgetrokken met alle andere abonnementen zodat er maar 1 factuur wordt verstuurd.'
];
$result[] = [
'AboOpmerking' => str_replace($strings, '', $row['AboOpmerking']),
];
未触及的字符串如下所示:
例1:
Originele startdatum 3-10-2017
例2:
2014年1月1日开始运营verzoek van klant de ingangsdatum
gelijkgetrokken会见了佐达特一号工厂的所有员工
沃尔特·弗斯图尔德
我找到了这个正则表达式,但我不知道如何使用它,因为当我打印$matches
^([0]?[1-9]|[1|2][0-9]|[3][0|1])[./-]([0]?[1-9]|[1][0-2])[./-]([0-9]{4}|[0-9]{2})$
您可以将
^
(匹配字符串位置的开头)和$
(匹配字符串位置的结尾)替换为\b
(单词边界)以将日期子字符串作为整个单词进行匹配,并使用preg\u match
(仅提取第一个匹配)或preg\u match\u all
(如果有多个):
见
单词边界的替代方法可以是(?和(?!\d)
lookarounds(如果日期可以粘在字母上或出现在下划线之间,这会很有帮助):
preg_match('~(?)正如建议的那样,有一种替代方法,您可以匹配类似日期的格式\d{1,2}-\d{1,2}-\d{4}
,并创建一个,也许还可以指定一个来验证它是否为有效日期
若要仅替换第一个日期,可以使用和并指定1作为第四个参数,以便仅执行1次替换
$strings = [
'Originele startdatum 3-10-2017',
'Originele startdatum 3-10-2017 3-10-2018 ',
'Originele startdatum 1-1-2014 Op verzoek van klant de ingangsdatum gelijkgetrokken met alle andere abonnementen zodat er maar 1 factuur wordt verstuurd.'
];
$pattern = '/\d{1,2}-\d{1,2}-\d{4}/';
foreach ($strings as $string) {
if (preg_match($pattern, $string, $matches) === 1 && false !== DateTime::createFromFormat('d-m-Y', $matches[0])) {
echo preg_replace($pattern, "", $string, 1) . "<br>";
}
}
$strings=[
“Originele startdatum 3-10-2017”,
“Originele startdatum 3-10-2017 3-10-2018”,
“2014年1月1日开始的工作计划中,凡克兰特·德因加斯达姆·格特洛肯会见了一位来自世界各地的专家。”
];
$pattern='/\d{1,2}-\d{1,2}-\d{4}/';
foreach($strings作为$string){
if(preg_match($pattern,$string,$matches)==1&&false!==DateTime::createFromFormat('d-m-Y',$matches[0])){
echo preg_replace($pattern,“,$string,1)。“
”;
}
}
两个看起来都不错,我认为第二个更能防故障,所以我选择了它。~
到底是做什么的?@Keesonnema这些是。它们将正则表达式的各个部分分开:1)动作,2)模式和3)标志/选项。我知道,我正要去。@Keesonnema顺便说一句,一个更简单的正则表达式,可以提取与日期相似的子字符串<代码>(?与1+位、-
、1+位、-
和4位数字匹配(因此,在标点符号或字母中不匹配),并且可能匹配122432345-42343453254564-2456
字符串。您是尝试匹配还是尝试删除?确切的输出应该是什么?这是一个非常复杂的正则表达式。这项工作是否会替换(([^0-9-]),“,$stringWithDate”)
@DanMiller不,因为正如我在问题中所说的,日期之后文本中可能有数字,这似乎与所有数字都匹配,-
你想这样做吗(??@revo谢谢。到目前为止,日期不会有不同的格式,所以接受的答案对我来说很好。但我也会保存这个,谢谢。谢谢,我会重新考虑我以后要用什么。
preg_match('~(?<!\d)(?:0?[1-9]|[12][0-9]|3[01])([./-])(?:0?[1-9]|1[0-2])\1(?:[0-9]{4}|[0-9]{2})(?!\d)~', $s, $matches);
$strings = [
'Originele startdatum 3-10-2017',
'Originele startdatum 3-10-2017 3-10-2018 ',
'Originele startdatum 1-1-2014 Op verzoek van klant de ingangsdatum gelijkgetrokken met alle andere abonnementen zodat er maar 1 factuur wordt verstuurd.'
];
$pattern = '/\d{1,2}-\d{1,2}-\d{4}/';
foreach ($strings as $string) {
if (preg_match($pattern, $string, $matches) === 1 && false !== DateTime::createFromFormat('d-m-Y', $matches[0])) {
echo preg_replace($pattern, "", $string, 1) . "<br>";
}
}