Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 删除字符串中的所有内容,具有特定模式的日期除外_Php_Regex_Preg Replace_Preg Match - Fatal编程技术网

Php 删除字符串中的所有内容,具有特定模式的日期除外

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

我试图从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.'
];

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