Обрезать контент перед поиском по ключевому слову в тексте - PullRequest
0 голосов
/ 31 октября 2011

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

Пример:

lients at the centre of the relationship and to offer a first class service to them, which includes tax planning, investment management and estate planning. We believe that our customer focused and...

(редактировать: иногда в слове отсутствует более одного символа)

Вы увидите, что он отрубил «c» от «клиентов».Это происходит только в начале текста, а не в конце.Как я могу это исправить?Я верю, что я на полпути туда.пока код:

function neatest_trim($content, $chars, $searchquery,$characters_before,$characters_after) {
            if (strlen($content) > $chars) {
                 $pos = strpos($content, $searchquery);
                 $start = $characters_before < $pos ? $pos - $characters_before : 0;
                $len = $pos + strlen($searchquery) + $characters_after - $start;
                $content = str_replace('&nbsp;', ' ', $content);
                $content = str_replace("\n", '', $content);
                $content = strip_tags(trim($content));
                $content = preg_replace('/\s+?(\S+)?$/', '', mb_substr($content, $start, $len));
                $content = trim($content) . '...';
                $content = strip_tags($content);
                $content = str_ireplace($searchquery, '<span class="highlight" style="background: #E6E6E6;">' . $searchquery . '</span>', $content);
            }
            return $content;
        }



 $results[] = Array(
  'text' => neatest_trim($row->content,200,$searchquery,120,80)
            );

Ответы [ 2 ]

0 голосов
/ 31 октября 2011

Почему бы просто не использовать регулярное выражение замены?

$result = preg_replace('/.*(.{10}\bword\b.{10}).*/s', '$1', $subject);

Таким образом, все 10 символов будут до и после ключевого слова 'word'

Объяснение:

# .*(.{10}\bword\b.{10}).*
# 
# Options: dot matches newline
# 
# Match any single character «.*»
#    Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «*»
# Match the regular expression below and capture its match into backreference number 1 «(.{10}\bword\b.{10})»
#    Match any single character «.{10}»
#       Exactly 10 times «{10}»
#    Assert position at a word boundary «\b»
#    Match the characters “word” literally «word»
#    Assert position at a word boundary «\b»
#    Match any single character «.{10}»
#       Exactly 10 times «{10}»
# Match any single character «.*»
#    Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «*»

Итак, это регулярное выражение находит слово, которое вы задаете (и только одно это слово, потому что оно включено в границы \ b-слова), и оно также находит в муравейнике (включая слово) 10 символов перед словом кака также десять символов после него.Вы можете сами создать регулярное выражение с переменными для символов до и после и, конечно же, с ключевым словом.Регулярное выражение также соответствует всему остальному, но для замены используется только обратная ссылка $ 1, которая является тем, что вы хотите в качестве вывода.

0 голосов
/ 31 октября 2011

120 символов, которые вы сохраняете в начале, не проверяют, является ли 120-й символ пробелом или буквой, а просто обрезают там строку, несмотря ни на что.

Я бы внес это изменение, чтобы найти ближайший «пробел» к позиции, с которой мы начинаем.

$start = $characters_before < $pos ? $pos - $characters_before : 0;
// add this line:
$start = strpos($content, ' ', $start);
$len = $pos + strlen($searchquery) + $characters_after - $start;

Таким образом, $start - это позиция пробела, а не буква из слова.

Ваша функция станет:

function neatest_trim($content, $chars, $searchquery,$characters_before,$characters_after) {
    if (strlen($content) > $chars) {
    $pos = strpos($content, $searchquery);
    $start = $characters_before < $pos ? $pos - $characters_before : 0;
    $start = strpos($content, " ", $start);
    $len = $pos + strlen($searchquery) + $characters_after - $start;
    $content = str_replace('&nbsp;', ' ', $content);
    $content = str_replace("\n", '', $content);
    $content = strip_tags(trim($content));
    $content = preg_replace('/\s+?(\S+)?$/', '', mb_substr($content, $start, $len));
    $content = trim($content) . '...';
    $content = strip_tags($content);
    $content = str_ireplace($searchquery, '<span class="highlight" style="background: #E6E6E6;">' . $searchquery . '</span>', $content);
    }
    return $content;
  }
...