我正在尝试使用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”,我得到一个结果字符串:
当我想得到的结果是“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”,事情变得奇怪,粗体标签变得格格不入。
答案 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');
答案 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);
注意2件事;
<b>Camp</b>ing
。