php - 如何提取字符串中特定关键字之后的子字符串?
问题描述
我需要处理具有大部分常规格式/结构的字符串。基本上,该字符串包含 3 个始终以相同顺序出现的关键字:ATLPáscoa
、ATLNatal
和ATLVerão
在这些关键字之间是未知数量的空白字符。此外,每个关键字后面都有可能由非空白字符和空白字符组成的日期值。
与它们的关键字相关联,我想声明 3 个名为$datePáscoa
、$dateNatal
和的变量,并将$dateVerão
日期子字符串分配给这些变量。
这是一个例子:
$string = 'ATLPáscoa ATLNatal ATLVerão Turno11-03a07desetembro';
我想要的输出是:
$datePáscoa = '';
$dateNatal = '';
$dateVerão = 'Turno11-03a07desetembro';
这是另一个例子:
$string = 'ATLPáscoa bananas ATLNatal xyza sd af ATLVerão Turno11-03a07desetembro';
我的预期输出是:
$datePáscoa = 'bananas';
$dateNatal = 'xyza sd af';
$dateVerão = 'Turno11-03a07desetembro';
我尝试使用str_replace()
,但显然不是这样:
$string = str_replace("Atelier","",$string );
$string = str_replace("Páscoa","",$string );
$string = str_replace("Natal","",$string );
$string = str_replace("Verão","",$string );
如何提取日期值并将值分配给适当的变量?
解决方案
代码:(演示 <- 使用替代输入字符串)
$string = 'ATLPáscoa banana ATLNatal xyza sd af ATLVerão Turno11-03a07desetembro';
$datePáscoa = preg_match('~ATLPáscoa\s*\K(?!ATL)\S+(?:\s+(?!ATL)\S+)*~u', $string, $out) ? $out[0] : '';
$dateNatal = preg_match('~ATLNatal\s*\K(?!ATL)\S+(?:\s+(?!ATL)\S+)*~u', $string, $out) ? $out[0] : '';
$dateVerão = preg_match('~ATLVerão\s*\K\S+(?:\s+\S+)*~u', $string, $out) ? $out[0] : '';
echo '$datePáscoa = '; var_export($datePáscoa); echo "\n";
echo '$dateNatal = '; var_export($dateNatal); echo "\n";
echo '$dateVerão = '; var_export($dateVerão);
输出:
$datePáscoa = 'banana'
$dateNatal = 'xyza sd af'
$dateVerão = 'Turno11-03a07desetembro'
如果这是我的项目,我可能会构建一个单一的正则表达式函数调用,它返回数组中的所有匹配项,然后我会在需要时提取我想要的内容。您已经要求单独命名的变量,所以我认为 3 个函数调用将是最简单的演示。
您提供的输入不需要包含u
模式修饰符,但我会添加它以防您的实际数据需要它。
\K
告诉正则表达式引擎从完整字符串匹配中“释放以前匹配的字符”——这用于避免使用捕获组并确保您的返回值只是“白肉”。同样的原因是您看到的原因\S+(?:\s+\S+)*
——它匹配一个“单词”,然后可选地匹配一个或多个空格,然后是另一个“单词”。
我var_export()
在我的演示中使用来表明结果中没有前导或尾随空格字符。
(?!ATL)
在前两个模式中用于避免“过度匹配”或基本上“匹配太远”。第三种模式不需要这种考虑。
推荐阅读
- python - 如何从 pyarrow 缓冲区反序列化 RecordBatch
- c# - 使用 iTextSharp 7 在 PDF 中搜索关键字
- java - Gradle:仅在给定特定参数时运行测试
- c# - 当特定的类被强制转换为其他东西时,JsonSerializer 的行为不像预期的那样
- vue.js - 在按钮单击时重定向到 Vue 中数据元素中指定的 url
- .htaccess - htaccess 总是删除 .php 但保留查询字符串 (AJAX)
- environment-variables - Git-Bash,如何修改环境变量
- r - 如何根据节点所属的组动态着色节点?
- encryption - 如何混淆维护数据语义结构的个人信息(意大利 GDPR 法)
- php - 当我使用 curl 时,我用邮递员访问 api 我得到响应,我得到空响应