PHP 搜索有例外的字符串

PHP search string with exceptions

我正在尝试使用 PHP 在字符串中搜索单个字母并将其替换为粗体字母。我创建了一个函数来执行此操作,如下所示:

function matchText($key,$before){
  $search = str_split($key);
  $after = $before;
  foreach($search as $s){
    $s1 = strtolower($s);
    $r1 = "<b>".$s1."</b>";
    $s2 = strtoupper($s);
    $r2 = "<b>".$s2."</b>";
    $after = str_replace($s1, $r1, $after);
    $after = str_replace($s2, $r2, $after);
    $after = str_replace("</b><b>","",$after);
  }
  return $after;
}

我传入搜索字符串($key)和要搜索的完整字符串($before)。 它将搜索字符串拆分为单独的字符以进行搜索,并为每个字符检查小写和大写版本并将其替换为粗体版本。最后它摆脱了任何连接 HTML < b > 标签,这样我就不会得到一个充满标签的字符串。

问题是当搜索字符串包含 "b" 时,它会替换所有 "b",包括 HTML < b > 标签中的那些,这会造成混乱的字符串。

例如,我正在搜索 Fred Campbell 的姓名列表并使用搜索字符串 "campb" 我得到的结果字符串为:

当我想要得到的结果是"Fred Campbell"

如果 "b" 被 < > 或 < / > 包围,是否可以在搜索中创建一个不替换字母 "b" 的异常?

或者换一种方式?

编辑:

这是 ajax 调用的一部分,当用户在文本字段中键入时,该调用会查询名称数据库。当他们键入时,会给出最多包含 10 个结果的下拉列表,搜索字符串在原始字符串中突出显示。 因此,例如,我的数据库有 2 个名称 "Fred Campbell" 和 "Andrew Flycamp"(随机名称:P)。如果用户键入 "camp",则下拉列表将包含两个名称,搜索字符串的每个字符均以粗体显示,并保留其原始大小写。

所以"Fred Campbell"变成"Fred Campbell","Andrew Flycamp"变成“Andrew Flycamp

注意 "Campbell" 中的大写字母和 "Flycamp" 中的小写字母。即使我搜索 "CAMP" 或 "Camp" 或 "camp".

也会发生这种情况

直到将 "b" 添加到搜索字符串之前,我的代码一直都很好,事情变得很奇怪,粗体标签变得一团糟,面目全非。

有一种更简单的方法:

function matchText($text, $key) {
  return preg_replace('#'.$key.'#i', '<b>'.$key.'</b>',$text);
}

$text = 'Fred Campbell';

echo matchText($text, 'camp');

那会 return :

Fred <b>Camp</b>bell

虽然 很好,但它的缺陷在于您不能将其用于单词,因为它会将部分单词替换为粗体文本。

我建议进行以下更改。

function matchText($text, $key, $blFullWord = TRUE) {
  if( $blFullWord ) {
     //We want to match the full word and not part-word
     return preg_replace('#\b('.$key.')\b#i', '<b></b>',$text);
  }
  return preg_replace('#('.$key.')#i', '<b></b>',$text);
}

$text = 'Fred Campbell was camping in a camp during the night';

//Fred Campbell was camping in a <b>camp</b> during the night
echo matchText($text, 'camp');
//Fred <b>Camp</b>bell was <b>camp</b>ing in a <b>camp</b> during the night
echo matchText($text, 'camp', FALSE);

https://eval.in/367640

注意两件事;

  • 我们要替换的词的捕获组允许我们在替换中引用它 - 这意味着我们保留大小写。
  • 单词边界。这意味着它将匹配完整的词,而不是子词,例如 <b>Camp</b>ing.

您将必须创建一个字符 class 并通过引用替换匹配的字符 [=11=]

<?php

function matchText($text, $key) {
  return preg_replace('/['.$key.']/i', '<b>[=10=]</b>', $text);
}

$text = 'Andrew Flycamp';

//<b>A</b>ndrew Fly<b>c</b><b>a</b><b>m</b><b>p</b>
echo matchText($text, 'camp');

https://eval.in/367653