алгоритм выделения терминов (HTML) - PullRequest
2 голосов
/ 15 октября 2010

Я знаю, что есть довольно много вопросов, выделяющих термины, но насколько я знаю, никто не отвечает на мои.Поисковые термины помещаются в массив

$keyarray = array("DE", "ABCD");
$string = "ABCDEF";
foreach ($keyarray as $value) {
   $string = str_ireplace($value, "<b>{$value}</b>", $string);
}

Результаты, очевидно, будут ABC DE F, а не ABCDE F Так что в любом случае его можно выделитьоба термина, использующие тег BOLD, чрезвычайно быстро используют PHP?

Ответы [ 3 ]

1 голос
/ 15 октября 2010

«Чрезвычайно быстрый» - относительный термин. Кроме того, у вас есть несколько вариантов:

  • Регулярные выражения: если вы хорошо разбираетесь в регулярных выражениях, это правильное применение для них. Вы также можете смотреть вперед / назад с ними, что обеспечивает большую гибкость.

http://www.regular -expressions.info / lookaround.html

  • Разбор символа за символом: часто это лучший способ манипулирования строками (и самый быстрый), но его создание может быть самым трудоемким.

  • Строка заменяет; быстро, но обычно это крайний случай, который не работает правильно (если судить по опыту).

Во всех этих сценариях вы можете получить выгоду от предварительной оптимизации списка терминов путем их соответствующей сортировки / группировки / фильтрации. Например, сортировка по наибольшей и наименьшей длине гарантирует, что вы не разбили длинную строку (и не пропустили совпадение), выделив короткую строку внутри нее.

Вы также можете заранее определить оптимальные регулярные выражения, изучив все условия поиска перед началом замены. Опять же, это предполагает, что вы довольно опытны с регулярными выражениями.

0 голосов
/ 15 октября 2010

Вы можете попробовать это:

$keyarray = array("DE", "ABCD");
$string = "ABCDEF";
$words = explode(' ',$string);
foreach($words as &$w){
   foreach($keyarray as $criteria) {
        if(stripos($w,$criteria)!==false){
            $w = "<b>$w</b>";
                    break;//avoid duplicate wrapping
        }
   }
}
$string = implode(' ',$words);
0 голосов
/ 15 октября 2010

может использовать регулярное выражение типа: /de|acbd/.регулярное выражение выполняет поиск слева направо и не возвращается, поэтому не будет такой ситуации, как <b>1111<b></b>112222</b>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...