gpt4 book ai didi

php - preg_replace_callback 突出显示模式在结果中不匹配

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:08:15 24 4
gpt4 key购买 nike

我有这个代码:

$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);
}

它的要点是能够输入一个字符序列(在上面的代码中它是一个固定的模式),它会在匹配的单词中找到并突出显示这些字符。我现在拥有的代码突出显示了整个单词。我正在寻找突出显示字符的最有效方法。当前代码的结果:

The quick brown fox jumped over the lazy dog and lived to tell about it to his crazy moped.

我想要的东西:

The quick brown fox jumped over the lazy dog and lived to tell about it to his crazy moped.

我是不是采取了错误的方法?如果有人能以正确的方式指出我,那就太棒了,我已经搜索了几个小时,但没有找到我要找的东西。

编辑 2:Divaka 帮了大忙。快到了。如果我对我的目标还不够清楚,我深表歉意。我将尝试进一步解释。

- A 部分 -

我将使用此代码的其中一件事是电话簿。一个简单的例子:输入以下字符时:

Jan

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

Jan Verhoeven
Arjan Peters
Raj Naren
Jered Von Tran

问题是我将遍历整个电话簿,每个人记录的人记录。每个人还有电子邮件地址、邮政地址、可能是网站、额外的注释等。这意味着我实际搜索的文本可以包含字母、数字、特殊字符(&@( )%_- 等..),换行符,最重要的是空格。因此,整个记录 (csv) 可能包含以下信息:

Name;Address;Email address;Website;Note

Jan Verhoeven;Veldstraat 2a, 3209 Herkstad;jan@werk.be;www.janophetwerk.be,jan@telemet.be;Jan die ik ontmoet heb op de bouwbeurs.\n Zelfstandige vertegenwoordiger van bouwmaterialen.

Raj Naren;Kerklaan 334, 5873 Biep;raj@werk.be;;Rechtstreekse contactpersoon bij Werk.be (#654 intern)

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

- B 部分 -

我想用它来搜索歌曲文本。当我在寻找一首歌时,我只记得它必须用鸭子或码头和一个圆圈来做某事,我会输入 dckcircle 并得到以下结果:

... and the ducks were all dancing in a great big circle, around the great big bonfire ...

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

- 结论 -

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

(a)(any character, max 3 spaces)(b)(any character, max 3 spaces)(c)

或更通用:

(a)({any character}{these characters with a limit of 3})(b)({any character}{these characters with a limit of 3})(c)

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

(a)({any character}{these characters with a limit of 3}{not these characters})(b)({any character}{these characters with a limit of 3}{not these characters})(c)

(我知道“{}”括号不能在正则表达式中以这种方式使用,但我不知道在不使用在正则表达式中有意义的字符的情况下如何放置它。 )


如果有人想知道,我知道 sql like 语句能够完成我正在尝试做的 80%(我猜,甚至可能更多),但我正在努力避免使用数据库以使其尽可能可移植。
找到正确答案后,我将清理这个问题(和代码)并在此处发布生成的 php 类(如果有用的话,我什至可能会把它放在 github 上),所以任何人都在寻找同样会有一个完整的 worker 类(Class)来工作:)。

最佳答案

我想到了这个。告诉我这是否是您想要的!

//$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;
}

关于php - preg_replace_callback 突出显示模式在结果中不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21272930/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com