带有异常

时间:2015-05-20 09:36:38

标签: php string search str-replace

我正在尝试使用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&lt; b>标签,所以我最终没有一个充满标签的字符串。

问题是当搜索字符串包含“b”并且它替换所有“b”时,包括HTML中的那些&lt; b>用于创建混乱字符串的标签。

例如,我正在搜索Fred Campbell的名单,并使用搜索字符串“campb”,我得到一个结果字符串:

Messed up string from Chrome Dev tools

当我想得到的结果是“Fred Campb ell”

有没有办法在搜索中创建一个例外,如果它被&lt; &GT;或者&lt; /&gt;?

或者可能是另一种方式吗?

编辑:

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

所以“Fred Campbell”成为“Fred Camp bell”而“Andrew Flycamp”成为“ A ndrew Fly 阵营

注意“Campbell”中的大写字母和“Flycamp”中的小写字母。即使我搜索“CAMP”或“Camp”或“camp”,也应该发生这种情况。

我的代码做得很好,直到搜索字符串中添加了“b”,事情变得奇怪,粗体标签变得格格不入。

3 个答案:

答案 0 :(得分:3)

有一种更简单的方法:

session_data

那将返回:

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

$text = 'Fred Campbell';

echo matchText($text, 'camp');

答案 1 :(得分:2)

您必须创建一个字符类,并通过引用\0替换匹配的字符。

<?php

function matchText($text, $key) {
  return preg_replace('/['.$key.']/i', '<b>\0</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

答案 2 :(得分:1)

尽管this answer很不错,但它的一些方面存在缺陷,你无法将其用于单词,因为它会用粗体文本替换部分单词。

我建议做以下更改。

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>\1</b>',$text);
  }
  return preg_replace('#('.$key.')#i', '<b>\1</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

注意2件事;

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