如何搜索在一串文本中找到的子串并突出显示所有子串

时间:2008-11-15 02:32:23

标签: php regex

我正在尝试突出显示搜索结果,但我希望包含受封闭标记限制的周围文本。

因此,如果$ term是“酷”,preg_replace最终应该是:

<div><span style="background: #f00">My hair cut so cool!</span></div>

不幸的是,我的正则表达式似乎没有捕获周围的文本,只有$ term。周围的标签可以是任何类型的有效标签。

    0:  
    1:  $term = 'cool';
    2:  ob_start();
    3:

   10:  foreach($items as $item) {
   11:    // echoing results here
   12:    echo '<div>' . $item->text . '</div>';
   13:  }

   30:  $content = ob_get_contents();
   31:  ob_clean() ;
   32:
   33:  $pattern = "/(?<!<[^>])($term)/i";
   34:  $replace = "<span style=\"background: #f00\">$1</span>";
   35:  echo preg_replace($pattern, $replace, $content);
   36: 

编辑:foreach循环是众多循环之一,位于一个单独的类中。因此,我无法在循环中进行替换。此外,处理最终输出而不是数据上的每个循环似乎更有效。

2 个答案:

答案 0 :(得分:2)

查找术语及其之前和之后的所有内容与查找术语之前和之后的所有字符(非尖括号)相同。使用正则表达式这是微不足道的:

$pattern = "/[^<>]*$term[^<>]*/i";
$replace = "<span style=\"background: #f00\">$0</span>";

答案 1 :(得分:-1)

为什么需要preg_replace?

这就是我如何解决问题:

案例1:突出显示结果的子字符串: 使用strpos()或stripos()来获取字符串中第一个匹配项的索引。 Next:获取从index-X到index + L + Y的子串,其中X和Y是定义的常量,用于描述在单词前后突出显示的字符数,L是单词的长度。然后在生成的子字符串周围应用一些-tag。

案例2:突出显示孔标记:您仍然可以通过strpos / stripos进行搜索。然后将字符串分成两部分:第一部分是从零到指针的子字符串,第二部分由字符串的其余部分组成。然后:找到'&gt;'的最后一次出现(strrpos / strripos)在字符串1和第一次出现的'&lt;'在字符串2.插入突出显示,并享受;)

  

有些人在面对问题时会想“我知道,我会使用正则表达式”。现在他们有两个问题 - 杰米·扎温斯基