天道酬勤,学无止境

PHP不区分大小写的单词替换(PHP Case Insensitive Word Replacement)

问题

好的,我正在尝试在正在制作的此搜索脚本中将搜索词加粗,除非我无法使其不区分大小写。

    function highlight($term,$target){
    $terms = explode(" ", $term);

    foreach($terms as $term){
        $result = (eregi_replace($term, "<strong>$term</strong>", $target));
    }
    return $result;
}

那就是我到目前为止所拥有的功能。在PHP.net上说eregi_replace是不区分大小写的匹配,但是由于某种原因,它显然不起作用。 (我是菜鸟)。

有任何想法吗? :D

回答1

从PHP 5.3开始不推荐使用ereg_* _ ereg_* (POSIX正则表达式)函数,并且很长时间以来都不建议使用。 最好使用PCRE( preg_* )函数(例如preg_replace)。

为此,您可以创建一个不区分大小写的正则表达式,然后将匹配项包装在<strong>标记中:

function highlight($term, $target)
{
  $terms = array_unique(explode(" ", $term)); // we only want to replace each term once
  foreach ($terms as $term)
  {
    $target = preg_replace('/\b(' . preg_quote($term) . ')\b/i', "<strong>$1</strong>", $target);
  }

  return $target;
}

这样做是首先在$term上调用preg_quote,这样,如果该术语中的正则表达式中包含任何具有含义的字符,则将其转义,然后创建一个正则表达式,查找该词被单词边界包围( \b -这样一来,如果该词为“好”,就不会与“再见”匹配。) 该术语用括号括起来,以使正则表达式引擎将其现有形式捕获为“反向引用”(正则表达式引擎将其保留在匹配项中的一种方式)。 通过指定i选项,使表达式不区分大小写。 最后,它用<strong>标记包围的相同反向引用替换所有匹配项。

$string = "The quick brown fox jumped over the lazy dog. The quicker brown fox didn't jump over the lazy dog.";
$terms = "quick fox";
highlight($terms, $string);
// results in: The <strong>quick</strong> brown <strong>fox</strong> jumped over the lazy dog. The quicker brown <strong>fox</strong> didn't jump over the lazy dog.

如果您想要关于正则表达式的好的教程,请查看regular-expressions.info上的教程。

回答2
function highlight($term,$target)
{
    $terms = explode(" ", $term);

    foreach($terms as $term){
        $target = (str_ireplace($term, "<strong>$term</strong>", $target));
    }
    return $target;
}
标签

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • JavaScript中不区分大小写的字符串替换?(Case insensitive string replacement in JavaScript?)
    问题 我需要不区分大小写地突出显示JavaScript字符串中的给定关键字。 例如: highlight("foobar Foo bar FOO", "foo")应该返回"<b>foo</b>bar <b>Foo</b> bar <b>FOO</b>" 我需要用于任何关键字的代码,因此使用像/foo/i这样的硬编码正则表达式是不够的解决方案。 最简单的方法是什么? (这是标题中详述的更一般问题的一个实例,但我认为最好用一个具体,有用的示例来解决。) 回答1 如果准备搜索字符串,则可以使用正则表达式。 在PHP中,例如,有一个函数preg_quote,用其转义版本替换字符串中的所有正则表达式字符。 这是针对javascript的此类功能(源代码): function preg_quote (str, delimiter) { // discuss at: https://locutus.io/php/preg_quote/ // original by: booeyOH // improved by: Ates Goral (https://magnetiq.com) // improved by: Kevin van Zonneveld (https://kvz.io) // improved by: Brett Zamir (https://brett-zamir.me) //
  • PHP preg_replace:不区分大小写的匹配和区分大小写的替换(PHP preg_replace: Case insensitive match with case sensitive replacement)
    问题 我在PHP中使用preg_replace来查找和替换字符串中的特定单词,如下所示: $subject = "Apple apple"; print preg_replace('/\bapple\b/i', 'pear', $subject); 结果为“梨梨”。 我想做的是以不区分大小写的方式匹配一个单词,但是在替换时尊重大小写-结果为“ Pear pear”。 以下作品有效,但似乎有点困扰我: $pattern = array('/Apple\b/', '/apple\b/'); $replacement = array('Pear', 'pear'); $subject = "Apple apple"; print preg_replace($pattern, $replacement, $subject); 有一个更好的方法吗? 更新:除了下面提出的一个很好的查询之外,出于此任务的目的,我只想尊重“标题大小写”,即单词的第一个字母是否为大写。 回答1 对于普通情况,我想到了此实现: $data = 'this is appLe and ApPle'; $search = 'apple'; $replace = 'pear'; $data = preg_replace_callback('/\b'.$search.'\b/i', function($matches) use
  • 如何替换字符串的某些部分?(How do I replace certain parts of my string?)
    问题 如何用另一部分替换字符串的特定部分? 输入字符串: "Hello, my name is Santa" 我怎样才能改变这一切a “在我的字符串,别的东西吗? 我认为我需要一个foreach循环,但不确定如何使用它。 回答1 strtr ($str, array ('a' => '<replacement>')); 或者更精确地回答您的问题: strtr ("Hello, my name is Santa", array ('a' => '<replacement>')); 回答2 搜索和替换 有几种不同的函数/方法可以将字符串的某个部分替换为其他内容,它们都有自己的优势。 ## str_replace()方法(二进制安全;区分大小写) 争论 混合str_replace(混合$ search ,混合$ replace ,混合$ subject [,int&$ count]) 在上面的定义中可以看到, str_replace()具有3个必需的参数,具有正确的顺序,所有这些参数都可以将字符串以及数组作为参数! 搜索和替换 搜索(字符串)和替换(字符串) →用替换字符串替换搜索字符串。 搜索(数组)和替换(字符串) →用替换字符串替换所有搜索元素。 搜索(字符串)和替换(数组) →引发通知:“注意:数组到字符串的转换”,因为仅一个搜索字符串的替换数组是没有意义的
  • 如何使用PHP检查另一个字符串中是否包含一个单词?(How can I check if a word is contained in another string using PHP?)
    问题 昵称代码 text = "I go to school"; word = "to" if ( word.exist(text) ) { return true ; else { return false ; } 我正在寻找一个PHP函数,如果单词在文本中存在,该函数将返回true。 回答1 您可以根据自己的需要选择几种方式。 对于这个简单的示例, strpos()可能是最简单,最直接的函数。 如果您需要对结果进行某些操作,则可能更喜欢strstr()或preg_match() 。 如果您需要使用复杂的模式而不是字符串作为指针,则需要preg_match() 。 $needle = "to"; $haystack = "I go to school"; strpos()和stripos()方法(stripos()不区分大小写): if (strpos($haystack, $needle) !== false) echo "Found!"; strstr()和stristr()方法(stristr不区分大小写): if (strstr($haystack, $needle)) echo "Found!"; preg_match方法(正则表达式,更灵活,但运行更慢): if (preg_match("/to/", $haystack)) echo "Found!"
  • 为什么PHP中的函数和方法不区分大小写?(Why are functions and methods in PHP case-insensitive?)
    问题 PHP中的函数和方法不区分大小写,如以下示例所示。 function ag() { echo '2'; } Ag(); class test { function clMe() { echo 'hi'; } } $instance = new test; $instance->clme(); 但这不是变量的情况。 有什么根据? 回答1 让我引用访谈– PHP的创建者Rasmus Lerdorf PHP的第一个版本是一组简单的工具,我将它们组合在一起用于我的网站和几个项目。 一种工具可以很好地记录到mSQL数据库,另一种则充当表单数据解释器。 在我厌倦了C之前,我最终得到了大约30种不同的用C编写的小CGI程序,并将它们全部合并到一个C库中。 然后,我编写了一个非常简单的解析器,该解析器将从HTML文件中挑选标签,并将其替换为C库中相应函数的输出。 简单的解析器逐渐增长为包括条件标记,循环标记,函数等。我认为我从来没有在编写脚本语言。 我只是在宏替换解析器中添加了一些功能。 我仍在用C编写所有真实的业务逻辑。 我在某处读到,由于引入的所有功能在本质上都感觉像HTML文档中的标记,并且HTML标记不区分大小写,因此他在PHP中选择的函数名称不区分大小写。 稍后,该功能仍保留在语言中。 回答2 是的,函数和方法名称不区分大小写。 是的,变量名称区分大小写。 我不确定这是有原因的
  • PHP不区分大小写的in_array函数(PHP case-insensitive in_array function)
    问题 使用in_array函数时是否可以进行不区分大小写的比较? 因此,使用这样的源数组: $a= array( 'one', 'two', 'three', 'four' ); 以下查找将全部返回true: in_array('one', $a); in_array('two', $a); in_array('ONE', $a); in_array('fOUr', $a); 哪些功能或一组功能会做同样的事情? 我不认为in_array本身可以做到这一点。 回答1 您可以使用preg_grep(): $a= array( 'one', 'two', 'three', 'four' ); print_r( preg_grep( "/ONe/i" , $a ) ); 回答2 显而易见的事情是将搜索词转换为小写: if (in_array(strtolower($word), $array)) { ... 当然,如果数组中有大写字母,则需要先执行以下操作: $search_array = array_map('strtolower', $array); 并搜索。 每次搜索都对整个数组执行strtolower毫无意义。 但是搜索数组是线性的。 如果你有一个大的数组或你打算这样做了很多,这将是更好地把搜索条件在阵列的关键,因为这将是更快的访问: $search_array = array
  • 在PHP中不区分大小写的xpath搜索(case insensitive xpath searching in php)
    问题 我有一个像这样的xml文件: <volume name="Early"> <book name="School Years"> <chapter number="1"> <line number="1">Here's the first line with Chicago in it.</line> <line number="2">Here's a line that talks about Atlanta</line> <line number="3">Here's a line that says chicagogo </line> </chapter> </book> </volume> 我正在尝试使用PHP进行简单的关键字搜索,以查找单词并显示其所在的行。 $xml = simplexml_load_file($data); $keyword = $_GET['keyword']; $kw=$xml->xpath("//line[contains(text(),'$keyword')]"); ...snip... echo $kw[0]." is the first returned item"; 但是,使用此技术,用户必须搜索“芝加哥”而不是“芝加哥”,否则搜索将不会返回任何内容。 我知道我需要使用翻译功能,但是我所有的尝试和错误都是徒劳的。 我试过了:
  • 在PHP中比较字符串时忽略大小写(Ignore case sensitivity when comparing strings in PHP)
    问题 我正在尝试比较单词是否相等,并且大小写无关。 但是PHP似乎不同意! 关于如何迫使PHP在比较它们时忽略单词大小写的任何想法? $arr_query_words = ["hat","Cat","sAt","maT"]; for( $j= 0; $j < count($arr_query_words); $j++ ){ $story_body = str_replace( $arr_query_words[ $j ], '<span style=" background-color:yellow; ">' . $arr_query_words[ $j ] . '</span>', $story_body ); } 即使情况不同,是否有办法进行更换? 回答1 使用str_ireplace执行不区分大小写的字符串替换( str_ireplace可从PHP 5获得): $story_body = str_ireplace($arr_query_words[$j], '<span style=" background-color:yellow; ">'. $arr_query_words[$j]. '</span>', $story_body); 要不区分大小写地比较字符串,请使用strcasecmp: <?php $var1 = "Hello"; $var2 = "hello"
  • PHP发誓单词过滤器(PHP swear word filter)
    问题 我正在开发一个WordPress插件,该插件用列表中的随机新单词替换评论中的不良单词。 我现在有2个数组:一个包含坏词,另一个包含好词。 $bad = array("bad", "words", "here"); $good = array("good", "words", "here"); 因为我是初学者,所以我在某个时候陷入了困境。 为了替换坏词,我一直在使用$newstring = str_replace($bad, $good, $string); 。 我的第一个问题是我想关闭区分大小写的功能,因此我不会输入诸如"bad", "Bad", "BAD", "bAd", "BAd", etc但是我需要新的保留原始单词格式的单词,例如,如果我写“ Bad”,则将其替换为“ Words”,但是如果键入“ bad”,则将其替换为“ words”,依此类推。 我的第一个强项是使用str_ireplace ,但是它忘记了原始单词是否带有大写字母。 第二个问题是我不知道该如何处理这样的类型的用户:“坏”,“单词”等。我需要一个主意。 为了使其选择一个随机词,我想我可以使用$new = $good[rand(0, count($good)-1)]; 然后$newstring = str_replace($bad, $new, $string); 。 如果您有更好的主意,我在这里听。
  • 如何在Java中替换不区分大小写的文字子字符串(How to replace case-insensitive literal substrings in Java)
    问题 使用String中的方法replace(CharSequence target, CharSequence replacement) ,如何使目标不区分大小写? 例如,它现在的工作方式: String target = "FooBar"; target.replace("Foo", "") // would return "Bar" String target = "fooBar"; target.replace("Foo", "") // would return "fooBar" 如何使它替换(或如果有更合适的方法)不区分大小写,以便两个示例都返回“ Bar”? 回答1 String target = "FOOBar"; target = target.replaceAll("(?i)foo", ""); System.out.println(target); 输出: Bar 值得一提的是replaceAll将第一个参数视为正则表达式模式,这可能会导致意外结果。 若要解决此问题,也请使用注释中建议的Pattern.quote。 回答2 如果您不关心大小写,则返回所有大写字母可能都没有关系: target.toUpperCase().replace("FOO", ""); 回答3 也许不如其他方法那么优雅,但是它非常扎实且易于遵循,尤其是。 对于刚接触Java的人。
  • xpath中不区分大小写的匹配?(case-insensitive matching in xpath?)
    问题 例如,对于下面的xml <CATALOG> <CD title="Empire Burlesque"/> <CD title="empire burlesque"/> <CD title="EMPIRE BURLESQUE"/> <CD title="EmPiRe BuRLeSQuE"/> <CD title="Others"/> <CATALOG> 如何用xpath匹配前4条记录,例如//CD[@title='empire burlesque'] 。 有xpath函数可以做到这一点吗? 还接受其他解决方案,例如PHP函数。 回答1 XPath 2具有小写(和大写)字符串功能。 这与不区分大小写的代码不太一样,但是希望它足够接近: //CD[lower-case(@title)='empire burlesque'] 如果您使用的是XPath 1,则有一个使用翻译的技巧。 回答2 matchs()是XPATH 2.0函数,允许不区分大小写的正则表达式匹配。 标志之一是i ,表示不区分大小写的匹配。 以下XPATH使用match()函数以及不区分大小写的标志: //CD[matches(@title,'empire burlesque','i')] 回答3 这在Chrome Developer工具中无法找到元素,我正在寻找屏幕上的“提交”按钮 //input[matches(
  • 如何使用正则表达式替换不区分大小写的字符串?(How do you do case-insensitive string replacement using regular expressions?)
    问题 我非常了解正则表达式,并且认为这是学习任何最基本的基础知识的一个好机会。 如何在C#中使用正则表达式替换大小写不敏感的字符串? myString.Replace("/kg", "").Replace("/KG", ""); (请注意,“ /”是文字。) 回答1 您可以使用: myString = Regex.Replace(myString, "/kg", "", RegexOptions.IgnoreCase); 如果您打算多次进行此操作,则可以执行以下操作: // You can reuse this object Regex regex = new Regex("/kg", RegexOptions.IgnoreCase); myString = regex.Replace(myString, ""); 使用(?i:/kg)会使正则表达式中的那一部分变得不区分大小写-就我个人而言,我更喜欢使用RegexOptions来使选项影响整个模式。 MSDN具有.NET正则表达式的相当合理的文档。 回答2 像这样: myString = Regex.Replace(myString, "/[Kk][Gg]", String.Empty); 请注意,它还将处理/ kG和/ Kg的组合,因此它比字符串替换示例还具有更多功能。 如果只想处理/ kg和/ KG的特定组合,请执行以下操作:
  • 怎么把PascalCase转换成pascal_case?(How to convert PascalCase to pascal_case?)
    问题 如果我有: $string = "PascalCase"; 我需要 "pascal_case" PHP是否为此提供功能? 回答1 尝试以下尺寸: $tests = array( 'simpleTest' => 'simple_test', 'easy' => 'easy', 'HTML' => 'html', 'simpleXML' => 'simple_xml', 'PDFLoad' => 'pdf_load', 'startMIDDLELast' => 'start_middle_last', 'AString' => 'a_string', 'Some4Numbers234' => 'some4_numbers234', 'TEST123String' => 'test123_string', ); foreach ($tests as $test => $result) { $output = from_camel_case($test); if ($output === $result) { echo "Pass: $test => $result\n"; } else { echo "Fail: $test => $result [$output]\n"; } } function from_camel_case($input) { preg_match_all(
  • 如何使用composer生成的classmap添加不区分大小写的自动加载?(How to add case insensitive autoloading using composer generated classmap?)
    问题 我有一个遗留项目,在不同情况下有声明和类用法。 我想将源代码升级到现代状态。 首先,我想用作曲家自动加载代替旧式自动加载。 但是composer不提供不区分大小写的自动加载功能。 如何使用作曲家的类映射和不敏感的自动加载? 回答1 将classmap添加到composer.json 。 "autoload": { "classmap": ["folder1/", "folder2/"] }, 然后运行composer.phar dumpautoload创建composer/autoload_classmap.php 。 更改您的代码。 后 require VENDOR_PATH . '/autoload.php'; 添加 $class_map = require VENDOR_PATH . '/composer/autoload_classmap.php'; $new_class_map = array(); foreach ($class_map as $class => $file) $new_class_map [strtolower($class)] = $file; unset($class_map); spl_autoload_register(function ($class)use($new_class_map) { $class = strtolower(
  • 我该如何替换两个字符串,以使一个字符串最终不会替换另一个字符串?(How can I replace two strings in a way that one does not end up replacing the other?)
    问题 假设我有以下代码: String word1 = "bar"; String word2 = "foo"; String story = "Once upon a time, there was a foo and a bar." story = story.replace("foo", word1); story = story.replace("bar", word2); 运行此代码后, story的值将为"Once upon a time, there was a foo and a foo." 如果我以相反的顺序替换它们,则会发生类似的问题: String word1 = "bar"; String word2 = "foo"; String story = "Once upon a time, there was a foo and a bar." story = story.replace("bar", word2); story = story.replace("foo", word1); story的价值将是"Once upon a time, there was a bar and a bar." 我的目标是将story变成"Once upon a time, there was a bar and a foo." 我该怎么办呢? 回答1 使用Apache
  • 使用string.gsub替换字符串,但仅替换整个单词(Use string.gsub to replace strings, but only whole words)
    问题 我有一个搜索替换脚本,它可以替换字符串。 它已经具有执行不区分大小写搜索和“转义”匹配的选项(例如,允许搜索%(等)。 现在如何要求我只匹配整个单词,我曾尝试在每个结尾添加%s,但这与字符串末尾的单词不匹配,因此我无法解决如何捕获白色字符的问题,发现在更换过程中保留完整的空格。 我是否需要使用string.find重做脚本,并添加用于单词检查的逻辑,或者可以使用模式来做到这一点。 我用于不区分大小写和转义的项目的两个函数如下,均返回要搜索的模式。 -- Build Pattern from String for case insensitive search function nocase (s) s = string.gsub(s, "%a", function (c) return string.format("[%s%s]", string.lower(c), string.upper(c)) end) return s end function strPlainText(strText) -- Prefix every non-alphanumeric character (%W) with a % escape character, where %% is the % escape, and %1 is original character return
  • 自学PHP笔记(四) PHP变量和常量
    本文转发来自:https://blog.csdn.net/KH_FC/article/details/115568310 PHP中变量有普通变量、可变变量和预定义变量,而常量就是普通变量和预定义变量。 1. 变量 在PHP中变量是内存中得一个命名单元,在系统中为程序中每个变量都分配一个存储单元,在这些存储单元中可以存储任何数据类型得数据。在PHP中不需要先声明变量后使用变量,只需要给变量赋值即可,但是PHP变量名称必须使用$字符做为前缀,变量名区分大写小写。【示例】为变量赋值 <?php $num = 3.1415926212; ?> 在进行赋值时只需要使用运算符=即可,在运算符等号左侧为变量名称右侧为变量值。 1.1 变量之间互相赋值 【示例】 <?php $num1 = 123; $num2 = $num1; echo $num2; ?> 输出结果为:123,在变量之间进行赋值时,只进行传递变量值,变量在存储单元中都是各自独立的,也就是说当输出$num1变量时也是可以输出的,不会输出空 1.2 引用赋值 引用赋值的意思就是将变量A与变量B做一个链接,当变量A值发生改变,变量B的值也随之进行改变。【示例】 <?php $a = 'test'; $b = &$a; $a = 'test1'; echo $b; ?> 输出结果为:test1引用方法也比较简单
  • 如何在MediaWiki数据库中进行重音和不区分大小写的搜索?(How to do an accent and case-insensitive search in MediaWiki database?)
    问题 假设我在Wiki(MediaWiki 1.19.4)中具有以下页面标题: SOMETHIng Sómethìng SomêthÏng SÒmetHínG 如果用户搜索something我希望将所有4页作为结果返回。 目前,我唯一想到的就是该查询(MySQL Percona 5.5.30-30.2): SELECT page_title FROM page WHERE page_title LIKE '%something%' COLLATE utf8_general_ci 仅返回SOMETHIng 。 我必须走正确的路,因为如果我搜索sóméthíng或SÓMÉTHÍNG ,则结果为SOMETHIng 。 如何修改查询,以便获得预期的其他结果? 这里的性能不是很关键,因为page表仅包含约2K行。 这是具有相关位的表定义: CREATE TABLE page ( (...) page_title VARCHAR(255) NOT NULL DEFAULT '' COLLATE latin1_bin, (...) UNIQUE INDEX name_title (page_namespace, page_title), ) 不能修改表定义,因为这是MediaWiki和AFAIK的原始安装,其代码期望以这种方式定义该字段(即,以二进制数据形式存储的unicode)。 回答1
  • 检查字符串是否包含数组中的值[重复](Check if string contains a value in array [duplicate])
    问题 这个问题已经在这里有了答案: 字符串包含数组中的所有项目(不区分大小写) (10个答案) 上个月关闭。 我正在尝试检测一个字符串是否包含至少一个存储在数组中的URL。 这是我的数组: $owned_urls = array('website1.com', 'website2.com', 'website3.com'); 该字符串由用户输入并通过PHP提交。 在确认页面上,我想检查输入的URL是否在数组中。 我尝试了以下方法: $string = 'my domain name is website3.com'; if (in_array($string, $owned_urls)) { echo "Match found"; return true; } else { echo "Match not found"; return false; } 无论输入什么,返回值始终为“找不到匹配项”。 这是正确的做事方式吗? 回答1 尝试这个。 $string = 'my domain name is website3.com'; foreach ($owned_urls as $url) { //if (strstr($string, $url)) { // mine version if (strpos($string, $url) !== FALSE) { // Yoshi
  • 如何在Vim中进行不区分大小写的搜索(How to do case insensitive search in Vim)
    问题 我想搜索一个大写单词,例如文件中的COPYRIGHT。 我尝试执行类似的搜索: /copyright/i # Doesn't work 但这是行不通的。 我知道在Perl中,如果将i标志赋予正则表达式,它将把正则表达式变成不区分大小写的正则表达式。 Vim似乎有其自己的方式来表示不区分大小写的正则表达式。 回答1 您可以在模式中的任何位置使用\c转义序列。 例如: /\ccopyright或/copyright\c甚至/copyri\cght 要进行逆运算(区分大小写的匹配),请改用\C (大写C)。 回答2 以及对\c和ignorecase的建议,我发现smartcase非常有用。 如果搜索包含大写字符的内容,它将进行区分大小写的搜索; 如果您搜索的内容完全是小写字母,它将执行不区分大小写的搜索。 您可以使用\c和\C来覆盖它: :set ignorecase :set smartcase /copyright " Case insensitive /Copyright " Case sensitive /copyright\C " Case sensitive /Copyright\c " Case insensitive 看: :help /\c :help /\C :help 'smartcase' 回答3 您可以在搜索前在Vim中设置ic选项: :set ic