首页 > 解决方案 > 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,然后是第三个 url

标签: phpregexpreg-replace

解决方案


以下正则表达式捕获所需的部分,如文本和 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现场演示在这里


推荐阅读