从Preg_Replace_Callback得到抵消?

时间:2018-06-17 08:25:50

标签: javascript php

我正在尝试将使用javascript替换函数的javascript翻译成PHP。 js replace有一个使用offset和source字符串值的回调。我尝试使用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

任何更简单的方式?

3 个答案:

答案 0 :(得分:1)

不幸的是,我们没有任何跟踪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>

答案 1 :(得分:1)

对于那些正在寻找解决方法的人。我以strpos结尾:

FutureBuilder

它将为您提供与其他$string = 'some text'; $position = 0; $callback = function (array $match) use ($string, &$position) { $offset = strpos($string, $match[0], $position); $position = $offset + strlen($match[0]); // do your stuff return 'replacement'; }; preg_replace_callback('/regex/', $callback, $string); 函数相同的偏移量。以字节为单位。使用多字节字符集时请记住这一点。

答案 2 :(得分:0)

您可以使用具有offset()byteOffset()方法的轻量级T-Regx library

pattern('(?:<del>(.|\n)*?<\/del>)')->replace($s)->first()->callback(function (Match $m) {

    $match->offset();       // offset in characters
    $match->byteOffset();   // offset in bytest

});

您可以在此处了解有关它们的更多信息:https://t-regx.com/docs/match-offsets