#php #javascript #jquery #regex
#php #javascript #jquery #регулярное выражение
Вопрос:
У меня есть текст, например :
Etiam porta sem malesuada magna mollis euismod. Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Etiam porta sem malesuada magna mollis euismod. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.
Nulla vitae elit libero, a pharetra augue. Vestibulum id ligula porta felis euismod semper. Vestibulum id ligula porta felis euismod semper. Maecenas sed diam eget risus varius blandit sit amet non magna. Vestibulum id ligula porta felis euismod semper. Integer posuere erat a ante venenatis dapibus posuere velit aliquet.
Cras mattis consectetur purus sit amet fermentum. Etiam porta sem malesuada magna mollis euismod. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Maecenas faucibus mollis interdum. Nullam quis risus eget urna mollis ornare vel eu leo.
Этот текст отображается как описание при поиске, выполняемом на моем веб-сайте, и я хочу иметь возможность выделить слово / строку и извлечь текст рядом с ним.
Я не уверен, что лучшим способом будет php (вероятно, есть) или просто использовать функцию jquery. Я знаю, как выделить слово в jQuery, но не уверен, как извлечь текст.
В этом примере я хочу показать в качестве описания, потому что моя искомая строка — «consectetur purus» следующий текст.
….posuere velit aliquet.Cras mattis consectetur purus sit amet fermentum. Etiam porta….
Как вы видите, я показываю не только выделенное слово, но и некоторый текст до и после него. Каков наилучший способ для достижения этой цели?
Я использую swish-e librari в качестве поисковой системы на своем веб-сайте, и мой уровень cgi равен нулю, поэтому я предпочитаю попробовать php-способ.
Большое спасибо за вашу помощь
Комментарии:
1. str_replace($word,»<b>$word</b>»,$result) ?
2. Но это все равно вернет весь текст, я просто хочу извлечь его краткое изложение. Может быть, 10 слов / 100 символов до и после совпадающего слова.
Ответ №1:
Используя регулярное выражение в php (хотя вы могли бы сделать то же самое в JavaScript).
$regex = '/([A-Za-z0-9.,-] s*){0,5}sconsectetur purus(s|[,.!?])(s*[A-Za-z0-9.,-] ){0,5}/';
preg_match($regex, $content, $matches);
echo $matches[0];
Это соответствует 0-5 словам, построенным с использованием буквенно-цифровых символов или одного из .,-
(finetune this), за которыми следуют слова, которые вы ищете (с пунктуацией или без нее в конце), за которыми следуют 0-5 слов. Это никогда не приведет к разрыву слова посередине, потому что достигается определенное количество символов.
Вывод:
posuere velit aliquet.
Cras mattis consectetur purus sit amet fermentum. Etiam porta
Теперь вы можете настроить это, например, удалить n
, добавить ...
, выделить consectetur purus
…
Комментарии:
1. Большое спасибо, это сделало свое дело. Позвольте мне спросить вас, как я поступаю, если слово встречается в тексте более одного раза. Могу ли я затем извлечь все фрагменты, чтобы показать их вместе?
2. @chifliiiii Возможно, вы захотите взглянуть на preg_match_all
3. @chifliiiii Я улучшил регулярное выражение, чтобы разрешить пунктуацию в конце вашего запроса 🙂
4. кажется, что что-то сломалось в последнем обновлении, поскольку оно больше не возвращает значения. Просто попробовал этот же пример в writecodeonline.com/php
5. Извините, я не знаю, почему он не работает в writecodeonline на моем сайте, не работал, потому что я писал свой поиск как «consectur», но в тексте «Consectur». Есть какой-нибудь способ сопоставить верхний или нижний?
Ответ №2:
Это зависит от того, как вы получаете ответ после поискового запроса и от того, как работает поисковая система.
Если ваша цель — поиск «при вводе», как у «Google», тогда было бы лучше сделать это с помощью php, чтобы сократить передаваемые данные и тратить меньше трафика.
В противном случае, если вы получаете весь текст в качестве ответа и не возражаете против загрузки — сделайте это с помощью JS, используя регулярное выражение или подсчет string.charAt( int )
.
Комментарии:
1. Да, текст уже загружен, как вы и думали. Можете ли вы дать мне немного информации о том, как это сделать с помощью javascript?
2. var x = x.replace( «([ S ]{,INT_CHARS_TO_LEFT})» word «([ S]{,INT_CHARS_TO_RIGHT})» , «…$1<b>» word «</b> $ 2 …» );
3. @chifliiiii В качестве альтернативы, посмотрите в регулярном выражении, которое я опубликовал в своем ответе.
4. @Michael: Комментарии к StackOverflow предназначены именно для этого: комментарии. Даже если бы вы использовали форматирование кода (которое поддерживается в комментариях, хотя и крайне ограничено), этот код был бы слишком большим для комментария. Если вы хотите расширить свой ответ, просто отредактируйте его и добавьте новую информацию. И добро пожаловать в SO!
Ответ №3:
Для этого мы создали небольшую библиотеку. Он выделит слова, которые вы упоминаете, и предоставит вам фрагмент предложений вокруг ваших слов запроса.
$lorumIpsum = "three paragraps of lrum ipsum";
TextSnippet::createSnippet('Lorem', $lorumIpsum);
Это приведет к следующему тексту:
Lorem ipsum dolor sit amet, consectetur adipiscing elit. … Etiam bibendum lorem nec tempus sollicitudin. … Sed in dapibus lorem. … Nunc turpis ipsum, bibendum quis sodales sed, ullamcorper et lorem. Donec et metus hendrerit, interdum elit ut, dignissim dui.
Класс также поддерживает настройку тега html для выделения с помощью, а также установку минимальных и максимальных слов для фрагмента.
Смотрите swisnl / textsnippet на Github.