javascript - 获取 Preg_Replace_Callback 的偏移量?

标签 javascript php

我正在尝试将使用 javascript 替换函数的 javascript 翻译为 PHP。 js 替换有一个使用偏移量和源字符串值的回调。我尝试使用 preg_replace_callback js 替换函数回调捕获偏移值,但 PHP 不提供此功能。

Javascript 函数如下:

log.replace(/(?:<del>(.|\n)*?<\/del>)|(?:<ins>(.|\n)*?<\/ins>)/g, 
 function(match, p1, p2, offsetval, strval) {
  //does something with the offsetval and strval
 });

是否有任何简单的方法可以使用带有回调的 preg_replace_callback 或 preg_match 来做到这一点?它实际上只是匹配而不是替换。

问题是 preg_match_all 支持偏移捕获但不支持回调,而 preg_replace_callback 支持回调但不支持偏移!!!

我在github上找到了这个函数https://gist.github.com/hakre/5376227

还有更简单的方法吗?

最佳答案

不幸的是,我们没有任何参数来跟踪 preg_replace_callback 中的偏移量但有机会拥有它。我将您自己的正则表达式修改为性能更好的正则表达式,然后将其添加到交替的另一侧:(?P<DOT>[\s\S]) 。如果交替的前一侧不匹配,则此正则表达式一次匹配一个字符。更准确地说,如果所需的正则表达式与保留偏移量不匹配,则向前迈出一步。

$str = "The color is <del>blue</del> or <ins>red!</ins>";
$offset = 0;
preg_replace_callback('/<(del|ins)>[\s\S]*?<\/\1>|(?P<DOT>[\s\S])/',
    function($m) use (&$offset) {
        //...
        $offset += strlen($m[0]); // $m[0] contains at least of character
    },
    $str
);

如果我在 echo $offset, "|", $m[0], "\n"; 之前回显 ( $offset )行,我们将得到以下输出:

0|T
1|h
2|e
3| 
4|c
5|o
6|l
7|o
8|r
9| 
10|i
11|s
12| 
13|<del>blue</del>
28| 
29|o
30|r
31| 
32|<ins>red!</ins>

关于javascript - 获取 Preg_Replace_Callback 的偏移量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50894957/

相关文章:

javascript - 如何在不使用for循环的情况下引用数组的多个索引值?

javascript - 为什么 React Bootstrap Navbar 保持折叠状态?

javascript - 为什么我的 react 查询请求数据不会显示?

javascript - 从选择下拉列表中创建查询字符串链接?

php - 从类中静态调用实例方法

php - 为什么我不能使用 PHP 将我的 24 小时制转换为 12 小时制的上午/下午时间?

javascript - 监听窗口属性变化

javascript - 为什么负 margin 不起作用?

php - 通过 PHP (CodeIgniter) 从数据库中使用 JQuery 自动完成

php - Laravel/Lumen api 过滤器