php - php中的Stackoverflow编辑器url替换
问题描述
我正在尝试模拟类似于 stackoverflow 编辑器行为的东西来替换 php 中的文本和 url。我很难找到正确的正则表达式或模拟这个的正确方法。
示例文本
We have [@url|first url|1] and
the [@url|the second url|2] and then [@url|the third url|3]
[1]: https://www.google.com
[2]: www.facebook.com
[3]: http://www.amazon.com
预期结果
解决方案
以下正则表达式捕获所需的部分,如文本和 URL:
\[@url\|([^|]+)\|(\d+)\](?=(?>.*\R+)+^\[\2]:\s+(\S+))
正则表达式现场演示在这里
分解:
\[@url\|([^|]+)\|(\d+)\]
匹配 @url 块并捕获文本和索引(?=
积极前瞻的开始(?>
原子(非捕获)组的开始.*\R+
匹配一行及其以下换行符
)+
小组结束,至少重复一次^\[\2]:\s+(\S+)
根据上面我们捕获的索引号匹配一个索引并捕获URL
)
正向预测结束
以下匹配最后的索引:
^\[\d+]:\h+\S+
所以在这里我们将使用preg_replace_callback
它们相应的锚标记替换这些块并删除索引:
$re = '/\[@url\|([^|]+)\|(\d+)\](?=(?>.*\R+)+^\[\2]:\s+(\S+))|^\[\d+]:\h+\S+/m';
echo preg_replace_callback($re, function($match) {
if (isset($match[1])) {
return "<a href=\"{$match[3]}\">{$match[1]}</a>";
}
}, $str);
PHP现场演示在这里
推荐阅读
- sql - ConcatRelated() 函数在表单上提供唯一值
- apache-pig - 从字符串中删除标点符号,期望在 Pig 拉丁语脚本中使用撇号
- mysql - 如何使用 MySQL 预览 Update Set Where 语句
- c - 初始化新指针时使用“restrict”实际上有什么作用吗?
- swift - 如何修复 RevealViewController() 手势识别器上的“可选零”?
- github-api - 提取 .zip 文件/文件夹结构然后使用 Github API 提交到 Github 的最佳方法是什么?
- node.js - 通过 nodejs 中的 stdin/stdout 流式传输 uint8
- python - Pandas 对行进行迭代以进行特征计算
- javascript - 如何在 beta 中禁用strapi 管理仪表板?
- javascript - 如何通过特征将对象从一个数组移动到另一个数组?