【发布时间】:2015-08-01 11:26:05
【问题描述】:
我正在尝试使用 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”,包括 HTML 标记中的那些,这会创建混乱的字符串。
例如,我正在搜索 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”之前,我的代码可以正常工作,然后事情变得奇怪,粗体标签被弄得面目全非。
【问题讨论】:
-
是的,preg_replace() 与正则表达式一起使用
标签: php string search str-replace