Для выдержки из результатов поиска, как найти несколько слов до и после поискового запроса?

В PHP я хотел бы иметь возможность ограничить количество символов вокруг слова, которое я пытаюсь сопоставить. Скажем:

  • $content содержит полный текст
  • $look_for содержит строку, которую я хочу найти в этом полном тексте

Я хочу, чтобы это было независимым от языка, включая такие языки, как китайский, в которых нет разделителей пробелов. Полный текст будет utf8. Я пробовал следующий код:

preg_match("/(.*){0,10}$look_for(.*){0,10}/i", $content, $matches);

При этом $matches пуст. Разве {0,10} не должен ограничивать символы вокруг предполагаемого слова?

Что в contents и что в look_for?

Wiktor Stribiżew 09.04.2022 11:14

Это не имеет значения. Вопрос был ясен, и уже предоставленный ответ был очень полезным. Не уверен, за что ваш отрицательный голос и т. д., Но хорошего дня.

Khom Nazid 09.04.2022 19:46
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Что нового в PHP 8.1?
Что нового в PHP 8.1?
Если вы все еще используете PHP 7, то эта статья для вас. В PHP 8, а именно в PHP 8.1, встроены некоторые очень востребованные функции, которые вам...
Разработка LMS на заказ для повышения эффективности работы и обучения
Разработка LMS на заказ для повышения эффективности работы и обучения
За последние годы в образовании произошла большая революция, и сегодня почти все учебные заведения делают упор на эксклюзивное управление учебным...
2
2
27
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

(.*){0,10} — это то, что известно как «катастрофический возврат», вместо этого используйте (.{10}).

<?php

$content = 'aaaaaaaabbbbbbbbcccccccc the quick brown fox jumps over the lazy dog xxxxxxxxyyyyyyyyzzzzzzzz';

$look_for = 'the quick brown fox jumps over the lazy dog';

$regex = '/(.{10})' . $look_for . '(.{10})/i';

$matches = [];

preg_match($regex, $content, $matches);

var_dump($matches);

Результат:

array(3) {
    [0]=>
    string(63) "bcccccccc the quick brown fox jumps over the lazy dog xxxxxxxxy"
    [1]=>
    string(10) "bcccccccc "
    [2]=>
    string(10) " xxxxxxxxy"
}

Идеальный. Таким образом, фигурные скобки должны были быть внутри круглыми скобками! Очень признателен.

Khom Nazid 09.04.2022 13:09

@KhomNazid Что, если $look_for находится внутри одного из .{10}? Вы можете пропустить действительные совпадения, если они будут найдены там.

Wiktor Stribiżew 09.04.2022 17:06

Не мой вариант использования, но спасибо за заботу.

Khom Nazid 09.04.2022 19:47

Другие вопросы по теме