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);
注意两件事;
- 我们要替换的词的捕获组允许我们在替换中引用它 - 这意味着我们保留大小写。
- 单词边界。这意味着它将匹配完整的词,而不是子词,例如
<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');
我正在尝试使用 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);
注意两件事;
- 我们要替换的词的捕获组允许我们在替换中引用它 - 这意味着我们保留大小写。
- 单词边界。这意味着它将匹配完整的词,而不是子词,例如
<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');