Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
包含异常的PHP搜索字符串_Php_String_Search_Str Replace - Fatal编程技术网

包含异常的PHP搜索字符串

包含异常的PHP搜索字符串,php,string,search,str-replace,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(

我正在尝试使用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){
$search=str_split($key);
$after=$before;
foreach($s搜索){
$s1=strtolower($s);
$r1=“”.$s1。”;
$s2=标准上限($s);
$r2=“”.$s2。”;
$after=str_replace($s1,$r1,$after);
$after=str_replace($s2,$r2,$after);
$after=str_replace(“,”,$after);
}
返回$after;
}
我传入搜索字符串($key)和要搜索的完整字符串($before)。 它将搜索字符串拆分为单个字符进行搜索,并为每个字符检查小写和大写版本,并将其替换为粗体版本。最后,它去掉了任何连接HTML的标记,这样我就不会得到一个满是标记的字符串

问题是当搜索字符串包含一个“b”时,它会替换所有的“b”,包括HTML标记中的那些,这些标记会创建混乱的字符串

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

当我想要的结果是“Fred Campbell”

如果字母“b”被<>或,是否有办法在搜索中创建一个例外,不替换字母“b”

或者是另一种方式

编辑:

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

所以“弗雷德·坎贝尔”变成了“弗雷德·坎贝尔”,“安德鲁·弗利坎普”变成了“安德鲁·弗利坎普”

请注意“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');
函数匹配文本($text,$key){
返回preg#u replace(“#”.$key.#i“,“.$key.”,$text);
}
$text='Fred Campbell';
echo matchText($text,'camp');
这将返回:

Fred <b>Camp</b>bell
弗雷德·坎贝尔
有一种更简单的方法:

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

$text = 'Fred Campbell';

echo matchText($text, 'camp');
函数匹配文本($text,$key){
返回preg#u replace(“#”.$key.#i“,“.$key.”,$text);
}
$text='Fred Campbell';
echo matchText($text,'camp');
这将返回:

Fred <b>Camp</b>bell
弗雷德·坎贝尔 虽然很好,但它有一个缺陷,您不能将其用于单词,因为它将用粗体文本替换部分单词

我建议做以下改变

函数matchText($text,$key,$blFullWord=TRUE){
如果($blFullWord){
//我们要匹配完整的单词,而不是部分单词
返回preg#u replace('.$key.')\b#i','\1',$text);
}
返回preg#u replace('.$key.')#i','\1',$text);
}
$text='弗雷德·坎贝尔在夜间露营';
//弗雷德·坎贝尔晚上在一个营地露营
echo matchText($text,'camp');
//弗雷德·坎贝尔晚上在一个营地露营
回显匹配文本($text,'camp',FALSE);

注意两件事

  • 我们要替换的单词上的捕获组允许我们在替换中引用它,这意味着我们保留了该案例
  • 单词边界。这意味着它将匹配整个单词,而不是子单词,例如
    Camping
虽然很好,但它有一个缺陷,您不能将其用于单词,因为它将用粗体文本替换部分单词

我建议做以下改变

函数matchText($text,$key,$blFullWord=TRUE){
如果($blFullWord){
//我们要匹配完整的单词,而不是部分单词
返回preg#u replace('.$key.')\b#i','\1',$text);
}
返回preg#u replace('.$key.')#i','\1',$text);
}
$text='弗雷德·坎贝尔在夜间露营';
//弗雷德·坎贝尔晚上在一个营地露营
echo matchText($text,'camp');
//弗雷德·坎贝尔晚上在一个营地露营
回显匹配文本($text,'camp',FALSE);

注意两件事

  • 我们要替换的单词上的捕获组允许我们在替换中引用它,这意味着我们保留了该案例
  • 单词边界。这意味着它将匹配整个单词,而不是子单词,例如
    Camping

您必须创建一个字符类,并通过引用替换匹配的字符
\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');

您必须创建一个字符类,并通过引用替换匹配的字符
\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');

yes有带正则表达式的use preg_replace()有带正则表达式的use preg_replace()
g
修饰符对php
preg_replace
My bad无效。不知道(但这是合乎逻辑的)。@ᵈˑ意味着两个人在根本不知道代码的情况下对其进行upV,尽管这是一个小错误,但答案应该符合逻辑并提供正确的代码。我是第二个投票人,因为这是一个简单的错误,而且很快就被修正了。@jake将
preg_replace
更改为
preg_replace(“#”(“$key”)#I',“\1',$text)。这将创建一个捕获组,以便您可以在替换中引用它。-
g
修饰符对php
preg\u replace
My bad无效。不知道(但这是合乎逻辑的)。@ᵈˑ意味着两个人在根本不知道代码的情况下对其进行upV,尽管这是一个小错误,但答案应该符合逻辑并提供正确的代码。我是我的第二个得票人