Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 17.07.2018, 12:18
Аватар для xShift
Профессор
Отправить личное сообщение для xShift Посмотреть профиль Найти все сообщения от xShift
 
Регистрация: 22.11.2016
Сообщений: 212

Вырезать более текста на PHP совпадающий с регуляркой
Собсно, нужна регулярка которая захватывает тект до и после вхождения скажем как снипет yandex или google для поиска на сайте. Порылся и хотел использовать rtrim и ltrim, но это не возможно в силу особенностей корявого PHP(обрезает неадекватно). Кто-то может подсказать regexp?

Вижу как вариант explode по ключу и дальше усечение индексов [0] и [2], но что-то мне подсказывает, что можно одной ругялркой решить.

Подскажите плиз.
Ответить с цитированием
  #2 (permalink)  
Старый 18.07.2018, 08:38
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,215

xShift, объясняльщик ты еще тот...

Покажи пример того текста и что из него собираешься "забрать".
Ответить с цитированием
  #3 (permalink)  
Старый 18.07.2018, 14:56
Аватар для xShift
Профессор
Отправить личное сообщение для xShift Посмотреть профиль Найти все сообщения от xShift
 
Регистрация: 22.11.2016
Сообщений: 212

Ну типа вот.

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
consequat. Duis aute irure [ololo] dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Ищем [ololo] и надо вывести сниппет типа:

... Duis aute irure [ololo] dolor in reprehenderit in voluptate velit esse ...

При множественных вхождениях нужно множество сниппетов. Вот я и ищу альтернативу explode.
Ответить с цитированием
  #4 (permalink)  
Старый 18.07.2018, 16:25
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,215

Сообщение от xShift
Ищем [ololo] и надо вывести сниппет типа:
... Duis aute irure [ololo] dolor in reprehenderit in voluptate velit esse ...
Т.е. выбрать нужно от "нужного" влево до начала предложения? А вправо до возврата каретки+перевод строки?
Ответить с цитированием
  #5 (permalink)  
Старый 18.07.2018, 16:36
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,215

Если я угадал - то, как вариант для затравки...


<!DOCTYPE html>
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=windows-1251' />
<script src='https://code.jquery.com/jquery-latest.js'></script>
<!--
<script src="https://code.angularjs.org/1.3.9/angular.min.js"></script>
<script src="https://code.angularjs.org/1.3.9/angular-route.js"></script>
-->
<style type='text/css'>
</style>
<script type='text/javascript'>
$(function(){
	var txt=$('#test').text();
	var re=/^|(\.\s).*?\[ololo\].*?(?=$|\n)/g;
	alert(txt.match(re)[1]);
});
</script>
</head>
<body>
<p id='test'>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod<br />
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,<br />
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo<br />
consequat. Duis aute irure [ololo] dolor in reprehenderit in voluptate velit esse<br />
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non<br />
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</p>
</body>
</html>
Ответить с цитированием
  #6 (permalink)  
Старый 18.07.2018, 16:42
Аватар для xShift
Профессор
Отправить личное сообщение для xShift Посмотреть профиль Найти все сообщения от xShift
 
Регистрация: 22.11.2016
Сообщений: 212

> Т.е. выбрать нужно от "нужного" влево до начала предложения? А вправо до возврата каретки+перевод строки?

Да не обязательно(это может быть первое слово предложения, а может быть последнее в последнем абзаце). Просто 4-5 слов слева и справа, но резулярка вроде годная, спасибо. Попробую на пых портировать.
Ответить с цитированием
  #7 (permalink)  
Старый 18.07.2018, 16:47
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,215

Сообщение от xShift
Просто 4-5 слов слева и справа
4-5 по возможности? Поскольку их может быть и меньше, если это начало текста или его конец.

Так же могут быть "оторваны" знаки препинания...
Ответить с цитированием
  #8 (permalink)  
Старый 18.07.2018, 17:37
Аватар для xShift
Профессор
Отправить личное сообщение для xShift Посмотреть профиль Найти все сообщения от xShift
 
Регистрация: 22.11.2016
Сообщений: 212

ksa, не знаю, все может быть, что очевидно скачивается последний гиг Detroit Become Human - сижу обзоры читаю. Наиграюсь, cделаю - выложу решение. Возможно все равно придется прибегнуть к колхозному explode

Победил лень и наваял чето вроде google отхлопа выдачи -5го уровня.


Цитата:

foreach ($search_query_result as $k => $v) {

$output .= '<li><a href="'. $v['field_route'] .'" title="'. $v['field_description'] .'">'. $v['field_title'] .'</a><span>'. $v['field_description'] .'</span>';

$snippet = preg_split("/". $query_string ."/i", $v['field_content']);

$counter = 1;

foreach ($snippet as $snip) {

$length = ( (int)strlen( $snip ) / 100) * 30; // aka *0.3

if( $counter % 2 !== 0 ) {

$highlight_1 = substr($snip, $length, 0);

}
else {

$highlight_2 = substr($snip, 0, $length);

}

$counter++;

}

$output .= '<dfn style="display:block; margin-bottom: 10px;">... '. trim(preg_replace('/ +/', ' ', preg_replace('/[^A-Za-z0-9 ]/', ' ', urldecode(strip_tags(html_entity_decode($highlight _1 . $query_string . $highlight_2 )))))) .' ...</dfn></li>';

}

$output .= '</ul><p>Search for <b>'. $query_string .'</b>.</p></div>';

print $output;
В $search_query_result запускаем все что прилетело с базы по LIKE %.
Переменная $query_string - содержит сабж запроса.

Далее делаем разбивку без регистра на блоки по совпадению $snippet = preg_split("/". $query_string ."/i", $v['field_content']);

$length = ( (int)strlen( $snip ) / 100) * 30; - тут настраиваем процент кастрации строки.

Ну и смотрим кратно ли двум наш счетчик. Если нет режем шкуру с жопы, если да - то снимаем скальп.

Дальше склеиваем строки, чистим сниппет от entities и html и выводим все нафиг пользователю.

Кто подскажет регулярку лучше - тому смачный минет(у меня не идеально).

Последний раз редактировалось xShift, 18.07.2018 в 21:21.
Ответить с цитированием
  #9 (permalink)  
Старый 19.07.2018, 15:41
Аватар для xShift
Профессор
Отправить личное сообщение для xShift Посмотреть профиль Найти все сообщения от xShift
 
Регистрация: 22.11.2016
Сообщений: 212

Еще потрахался и убрал ошметки entities из PHP.
Почему-то при втором пробеге основного массива теги не состригаются и остаются какашки в тексте сниппета, что говорит о том, что гребаный PHP обладает не меньшим количеством мудизмов, чем JS. Только вот в JS их нужно уметь готовить, а в PHP - это необъяснимая срань(иногда не работают операторы && в if, иногда strip_tags на foreach, иногда не ставится header полсе print и так далее ). Это все увлекательно и интересно, но сука бесит и доводит до абсурда. Это заражает мозг и ты привыкаешь на других языках делать так-же - напримр не использовать map, forEach и reduce в пользу нативного for if кода.

Собсна, очередной lol в студию. Странно, что в этот раз PHP под Mac ведет себя не так как под Linux, но это уже отдельная песня(всех пиздить).


Нужно поменять вот это на это и убрать обработку в конце:

$replace = trim(preg_replace('/ +/', ' ', preg_replace('/[^A-Za-z0-9 ]/', ' ', urldecode(strip_tags(html_entity_decode(strip_tags(preg_replace('/<[^>]*>/','',str_replace(array("&nbsp;","\n","\r"),"",html_entity_decode($v['field_content'], ENT_QUOTES,'UTF-8'))))))))));

$snippet = preg_split("/". $query_string ."/i", $replace);

...

 $output .= '<dfn style="display:block; margin-bottom: 10px;">... '. $highlight_1 . $query_string . $highlight_2 .' ...</dfn></li>';


К сожалению и жабаскрипт не лучше порой, но это на мой взгляд не должно пораждать и как ни странно не пораждает бакланов типа профессионалов как на PHP утверждающих, что header set после принт - это не по стандарту. Они по факту не осознают и не хотят замечать багов(как вообще эти ебланы так программируют ? - с одного из популярных ресурсов миф, куда зашел с вопросом почему cookie не устанавливается).

p.s.: если кто знает как решить красивее, подскажите.

Последний раз редактировалось xShift, 19.07.2018 в 15:43.
Ответить с цитированием
  #10 (permalink)  
Старый 20.07.2018, 10:04
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,215

Сообщение от xShift
если кто знает как решить красивее, подскажите
Вот вариант с "вырезкой" до 5 слов слева и справа от "искомой" подстроки...


<!DOCTYPE html>
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=windows-1251' />
<script src='https://code.jquery.com/jquery-latest.js'></script>
<!--
<script src="https://code.angularjs.org/1.3.9/angular.min.js"></script>
<script src="https://code.angularjs.org/1.3.9/angular-route.js"></script>
-->
<style type='text/css'>
</style>
<script type='text/javascript'>
$(function(){
	var txt=$('#test').text();
	var re=/(\S+\s){1,5}\[ololo\](\s\S+){1,5}/g;
	alert(txt.match(re));
});
</script>
</head>
<body>
<p id='test'>Lorem ipsum dolor [ololo] sit amet, consectetur adipisicing elit, sed do eiusmod<br />
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,<br />
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo<br />
consequat. Duis aute irure [ololo] dolor in reprehenderit in voluptate velit esse<br />
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non<br />
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</p>
</body>
</html>
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вырезать ненужный участок текста affaff Ваши сайты и скрипты 16 18.06.2018 14:43
Как с помощью скрипта высчитать ширину полосы прокрутки? LADYX Элементы интерфейса 35 13.11.2017 12:50
Подгрузка в див текста из php через java blyskawka jQuery 2 06.11.2012 23:44
Вырезать регуляркой число KamalovRadik jQuery 2 10.02.2012 18:27
Вырезать регуляркой greatilya Серверные языки и технологии 17 24.07.2009 18:00