php - 使用正则表达式解析字符串并获得所需的输出
问题描述
我想解析这个字符串
[[delay-4]]Welcome! [[delay-2]]Do you have some questions for us?[[delay-1]] Please fill input field!
我需要得到这样的东西:
[
[0] => '[[delay-4]]Welcome!',
[1] => '[[delay-2]]Do you have some questions for us?',
[2] => '[[delay-1]] Please fill input field!
];
字符串也可以是这样的(开头没有 [[delay-4]]):
Welcome! [[delay-2]]Do you have some questions for us?[[delay-1]] Please fill input field!
预期的输出应该是这样的:
[
[0] => 'Welcome!',
[1] => '[[delay-2]]Do you have some questions for us?',
[2] => '[[delay-1]] Please fill input field!
];
我试过这个正则表达式(https://regex101.com/r/Eqztl1/1/)
(?:\[\[delay-\d+]])?([\w \\,?!.@#$%^&*()|`\]~\-='\"{}]+)
但是如果有人[
在文本中只写了一个,那么我对那个正则表达式有问题,正则表达式失败,如果我包含[
匹配我得到错误的结果。
谁能帮我这个?
解决方案
两个更简单的操作可能是获得结果的途径:
$result = preg_replace('/\s*(\[\[delay-\d+]])/i', "\n$1", $subject);
$result = preg_split('/\r?\n/i', $result, -1, PREG_SPLIT_NO_EMPTY);
可以在这里看到运行: https ://ideone.com/Z5tZI3 和这里: https ://ideone.com/vnSNYI
这假设换行符没有特殊含义并且可以拆分。
更新:正如在下面的评论中所指出的,单次拆分是可能的。
$result = preg_split('/(?=\[\[delay-\d+]])/i', $subject, -1, PREG_SPLIT_NO_EMPTY);
但是零长度匹配和正则表达式可能存在问题,您必须对此进行自己的研究。
推荐阅读
- javascript - 如何实现重复的承诺调用链?
- sql - SQL Server:如何将 int 的值转换为 hh:mm
- mysql - SQLite 结果与 MySQL 结果不同
- ios - 如何使用特定用户的 uid 获取特定用户的数据?
- python - 获取数据框中每一列的差异并在完成后重新排序的最有效方法
- python - 合并同一数据框中的重复列
- html - iframe 无法在 Firefox 中打开 pdf 文件“无法预览”
- mysql - 如何使用mysql比较来自两个不同表的两个字段?
- websphere - Websphere Liberty server.xml 功能管理器错误
- vba - 从 Office.Interop.Outlook 迁移