Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php preg_replace_回调高亮显示模式在结果中不匹配_Php_Regex_Algorithm_Replace - Fatal编程技术网

Php preg_replace_回调高亮显示模式在结果中不匹配

Php preg_replace_回调高亮显示模式在结果中不匹配,php,regex,algorithm,replace,Php,Regex,Algorithm,Replace,我有以下代码: $string = 'The quick brown fox jumped over the lazy dog and lived to tell about it to his crazy moped.'; $text = explode("#", str_replace(" ", " #", $string)); //ugly trick to preserve space when exploding, but it works (faster than preg_spli

我有以下代码:

$string = 'The quick brown fox jumped over the lazy dog and lived to tell about it to his crazy moped.';
$text = explode("#", str_replace(" ", " #", $string)); //ugly trick to preserve space when exploding, but it works (faster than preg_split)
foreach ($text as $value) {
    echo preg_replace_callback("/(.*p.*e.*d.*|.*a.*y.*)/", function ($matches) {
        return " <strong>".$matches[0]."</strong> ";
    }, $value);
}
$string=“那只敏捷的棕色狐狸跳过了那只懒狗,活到了他那辆疯狂的轻便摩托车面前。”;
$text=explode(“#”,str#u replace(“,“#,$string))//爆炸时保留空间的丑陋把戏,但它有效(比preg_split更快)
foreach($text作为$value){
echo preg_replace_回调(“/(*p.*e.*d.*a.*y.*)/”,函数($matches){
返回“”$matches[0]。“”;
}美元价值);
}
它的目的是能够输入一系列字符(在上面的代码中,它是一个固定模式),并在匹配的单词中查找和突出显示这些字符。我现在的代码突出显示了整个单词。我正在寻找最有效的方式来突出人物。 当前代码的结果:

那只敏捷的棕色狐狸跳过了那只懒狗,活到了他那只疯狂的轻便摩托车面前

我想要的是:

这只敏捷的棕色狐狸在lazy狗的身上猛扑过去,活到了向他的crazymoped讲述这件事的时候

我采取了错误的方法吗?如果有人能给我指出正确的方向,那就太棒了,我已经搜索了好几个小时,但没有找到我想要的东西

编辑2: 迪瓦卡帮了大忙。快到了。。如果我对自己的目标不够清楚,我向你道歉。我会尝试进一步解释

-A部— 我将使用此代码的一个原因是电话簿。一个简单的例子: 输入以下字符时:

一月

我需要它来匹配以下示例:

1月Verhoeven
ArjanPeters
RajNareN
JTran

问题是,我将迭代整个电话簿,每个人的记录。每个人都有电子邮件地址,一个邮政地址,可能是一个网站,一张额外的便条,等等。。这意味着我正在搜索的文本可以包含任何内容,从
字母、数字、特殊字符(&@()%.-等)、换行符,最重要的是空格
。因此,整个记录(csv)可能包含以下信息:

姓名;地址;电邮地址;网站;注

扬·韦霍文;维尔德斯特拉特2a,3209赫克斯塔德;jan@werk.be;www.janofetwerk.be,jan@telemet.be;我可以在布瓦伯尔的工作区工作。\n泽尔夫斯坦迪格·维特根沃尔迪格·范·布瓦材料公司。

拉吉·纳伦;Kerklaan 3345873 Biep;raj@werk.be;;Rechtstreekse联系人bij Werk.be(#654实习生)

\n
是一个实际的换行符。因此,如果我搜索
@werk.be
,我希望看到这两条记录

-B部— 我还想用它来搜索歌曲文本。当我在寻找一首歌曲时,我只记得它必须与鸭子或码头和圆圈有关,我会进入
dckcircle
并得到以下结果:

。。。而ducks都围着篝火在一个大大的圆圈里跳舞

为了能够微调搜索,我希望能够限制空格(或任何其他字符)的数量,因为我会想象它在每首歌曲中找到一个简单的模式,如
eve
,而我只在寻找一首歌中有确切的单词
eve

-结论- 如果我用伪正则表达式来总结这一点,对于一个搜索模式
abc
,中间最多有3个空格,它会是这样的:(我可能完全不在这里)

(a) (任何字符,最多3个空格)(b)(任何字符,最多3个空格)(c)

或更通用:

(a) ({any character}{这些字符限制为3})(b)({any character}{这些字符限制为3})(c)

我猜这甚至可以很容易地扩展到这一点:

(a) ({任何字符}{这些字符限制为3}{非这些字符})(b)({任何字符}{这些字符限制为3}{非这些字符})(c)

(我知道´{}´括号在正则表达式中不能这样使用,但我不知道如果不使用在正则表达式中有意义的字符,该如何放置它。)
如果有人想知道的话,我知道sql
like
语句可以完成我想做的事情的80%(我猜,甚至可能更多),但我正试图避免使用数据库使其尽可能可移植。

找到正确答案后,我将清理这个问题(以及代码),并将生成的php类发布在这里(如果有用的话,我甚至会将其放在github上),这样任何寻找相同答案的人都可以使用一个完全可用的类:)。

我想到了这个。告诉我这是不是你想要的

//$string = "The quick brown fox jumped over the lazy dog and lived to tell about it to his crazy moped.";
$string = "abcdefo";

//$pattern_array1 = array(a,y);
//$pattern_array2 = array(p,e,d);
$pattern_array1 = array(e,f);
$pattern_array2 = array(o);
$pattern_array2 = array(a,f);

$number_of_patterns = 2;

$regexp1 = generate_regexp($pattern_array1, 1);
$regexp2 = generate_regexp($pattern_array2, 2);

$string = preg_replace($regexp1["pattern"], $regexp1["replacement"], $string);
$string = preg_replace($regexp2["pattern"], $regexp2["replacement"], $string);

$string = transform_multimatched_chars($string);

// transforming other chars after transforming the multimatched ones
for($i = 1; $i <= $number_of_patterns; $i++) {
    $string = str_replace("#{$i}", "<strong>", $string);
    $string = str_replace("#/{$i}", "</strong>", $string);
}

echo $string;

function generate_regexp($pattern_array, $pattern_num) {
    $regexp["pattern"] = "/";
    $regexp["replacement"] = "";
    $i = 0;
    foreach($pattern_array as $key => $char) {
        $regexp["pattern"] .= "({$char})";
        $regexp["replacement"] .= "#{$pattern_num}\$". ($key + $i+1) . "#/{$pattern_num}";
        if($key < count($pattern_array) - 1) {
            $regexp["pattern"] .= "(?s)((?:(?!{$pattern_array[$key + 1]})(?!\s).)*)";
            $regexp["replacement"] .= "\$".($key + $i+2) . "";
        }

        $i = $key + 1;
    }
    $regexp["pattern"] .= "/";

    return $regexp;
}

function transform_multimatched_chars($string)
{
    preg_match_all("/((#[0-9]){2,})(.*)((#\/[0-9]){2,})/", $string, $matches);

    // change this for your purposes
    $start_replacement = '<span style="color:red;">';
    $end_replacement = '</span>';

    foreach($matches[1] as $key => $match)
    {
        $string = str_replace($match, $start_replacement, $string);
        $string = str_replace($matches[4][$key], $end_replacement, $string);
    }

    return $string;
}
/$string=“那只敏捷的棕色狐狸跳过了那只懒狗,活到了他那辆疯狂的轻便摩托车面前。”;
$string=“abcdefo”;
//$pattern_array1=阵列(a,y);
//$pattern_array2=数组(p,e,d);
$pattern_array1=阵列(e,f);
$pattern_array2=阵列(o);
$pattern_array2=阵列(a,f);
$number_of_patterns=2;
$regexp1=generate_regexp($pattern_array1,1);
$regexp2=generate\u regexp($pattern\u array2,2);
$string=preg_replace($regexp1[“pattern”],$regexp1[“replacement”],$string);
$string=preg_replace($regexp2[“pattern”],$regexp2[“replacement”],$string);
$string=transform\u multimatched\u字符($string);
//在转换多重匹配字符后转换其他字符
对于($i=1;$i$char){
$regexp[“pattern”]。=“({$char})”;
$regexp[“replacement”]。=“#{$pattern_num}\$”($key+$i+1)。“#/{$pattern_num}”;
if($key