Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   Вырезать более текста на PHP совпадающий с регуляркой (https://javascript.ru/forum/server/74505-vyrezat-bolee-teksta-na-php-sovpadayushhijj-s-regulyarkojj.html)

xShift 17.07.2018 12:18

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

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

Подскажите плиз.

ksa 18.07.2018 08:38

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

Покажи пример того текста и что из него собираешься "забрать".

xShift 18.07.2018 14:56

Ну типа вот.

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.

ksa 18.07.2018 16:25

Цитата:

Сообщение от xShift
Ищем [ololo] и надо вывести сниппет типа:
... Duis aute irure [ololo] dolor in reprehenderit in voluptate velit esse ...

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

ksa 18.07.2018 16:36

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


<!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>

xShift 18.07.2018 16:42

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

Да не обязательно(это может быть первое слово предложения, а может быть последнее в последнем абзаце). Просто 4-5 слов слева и справа, но резулярка вроде годная, спасибо. Попробую на пых портировать.

ksa 18.07.2018 16:47

Цитата:

Сообщение от xShift
Просто 4-5 слов слева и справа

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

Так же могут быть "оторваны" знаки препинания...

xShift 18.07.2018 17:37

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 19.07.2018 15:41

Еще потрахался и убрал ошметки 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 после принт - это не по стандарту. Они по факту не осознают и не хотят замечать багов(как вообще эти ебланы так программируют :D ? - с одного из популярных ресурсов миф, куда зашел с вопросом почему cookie не устанавливается).

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

ksa 20.07.2018 10:04

Цитата:

Сообщение от 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>

laimas 20.07.2018 10:16

Цитата:

Сообщение от xShift
что говорит о том, что гребаный PHP обладает не меньшим количеством мудизмов, чем JS.

Хрень не надо писать и РНР не будет виновен, тем более что PCRE базируется на Perl, а не выдумано свое.

xShift 20.07.2018 10:24

laimas, так почему хрень то? У вас ltrim и rtrim, к примеру, нормально работает? У меня просто необъяснимо :D

laimas 20.07.2018 10:27

Цитата:

Сообщение от xShift
так почему хрень то

Потому, что нужно вникнуть в PRCE, кое гораздо богаче, чем RegEXP в JS. Плохому танцору всегда "эти" мешают. ;)

Цитата:

Сообщение от xShift
У вас ltrim и rtrim, к примеру, нормально работает?

У лично у меня такого нет, а то что предлагает РНР работает так как и полагается, в меру возложенных на них способностей.

xShift 20.07.2018 15:05

laimas, да ладно вам. Бажный он просто и это подтвердят многие. Оправданий этому нет. А еще нет оправданий людям, которые столько лет писали обертки в замен нативного кода из за багов, имели возможность просто отписать об ошибке программистам языка. Нет вместо этого они писали тысечестрочные обвязки. Из этого и получаются ненужные TS, JSX и прочее. Из этого получается ненужный Composer с сотнями тысяч строк хлама. А виноватой могла быть маленькая букашка, которую никто не захотел разработать. Я так на это смотрю. И кто мне потом скажет, что я пишу чушь? Я вот смогу сказать, что они глупые динозавры и все работает без этих оснасток не хуже, но кому теперь доказывать?

Спорить бесполезно.

Там кстати в примерах анимаций , где пример с эффектами bounce найден шансовый infinity loop в движках Chromium. Поправьте пожалуйста код, а то кто нибудь как я подвиснет на 2 месяца.

Бразерщики сказали WontFix ( не возможно исправить ).

laimas 20.07.2018 16:03

Что вы несете? Вы первый кто обнаружил, что у него не так работает rtrim и ltrim. А вы что от них ожидали? Если вам кажется, что не так, значит вы не понимаете работы этих функций. С таким же успехом можно предъявит претензии к любому языку, к JS за то, что document.write работает не так как вам хочется. Значит JS фуфло, написанное какими-то додиками.

У любого языка есть недостатки, идеального вы не найдете. Но они развиваются, что-то выпиливается как ошибочное или не оправдавшееся, что-то изменяется, добавляется. Выбор же языка определяется задачами. Вас не устраивается чем-то РНР, производительностью, функциональностью, ...? Ну вас же никто не насилует, выберите тот, что более соответствует вашим задачам.

Я читал в других ваших темах и о MySQL, без обид, но то что вы там несете, это полнейшая ахинея. С таким базисом давать оценки, это уже самоуверенность. ;)

ksa 20.07.2018 16:19

Цитата:

Сообщение от laimas
к JS за то, что document.write работает не так как вам хочется.

У людей IF и FOR в JS не работают! :D

laimas 20.07.2018 16:30

Цитата:

Сообщение от ksa
У людей IF и FOR в JS не работают!

:blink: Шок! До чего страну довели! Как страшно жить. :yes:

xShift 21.07.2018 10:15

Все что у меня разработалось нормального портировали в python те самые ребята, которые на этом шлаке не пишут. Я лишь создаю удачные модели для себя. Но мое программирование не сравнится с энтерпрайз решениями.

xShift 21.07.2018 10:47

Давайте, так, мужики ... Вот пример. Что не так с моим кодом и почему вывод такой "нормальный":

ass="test"
le="javascript:"
=" javascript:"


$attrs = [
	'class="test"',
	'title="javascript:"',
	'src=" javascript:"',
];

foreach ($attrs as $a) {
	print  ltrim($a, 'javascript: ') . '<br />';
}


После этого, если не докажете обратного(только говорить что на каком-то отдельном Linux этот же код ведет себя по другому не нужно мне - все с этим PHP понятно, если он еще и ведет себя по разному). Это самый маленький пример уебщиности сего языка. Могу привести еще штук 15, но что вам это даст.

Еще раз говорю о JS. Не будет ничего из ангуляр и тайп скрипт портировано в оригинальный JS. Нам уже хватило ебланов, которые придумали вот это ??. Дальше над этим языком не даст издеваться никто. Хватило и шуток с промисами и с классами, и со всем эти высокоумнум дерьмом, от которого ноль профита. Я со всеми работаю. И все это обсуждаемо постоянно.

За одни нестатандатрные атрибуты, когда есть data-attr, подразумевающий любые данные, а не ng-hueta-apply - это будет через мой труп, и это не получится. Пока уж меня серьезно воспринимают, я такой хуйни не дам в стандарт засунуть.

PHP по разумным причинам все эти ошибки устранить не может потому что они заложены чуть не с рождения и если они это исправят - то говнокод тысяч бедолаг после обновления банально наебнется.

Сабж.

Nexus 21.07.2018 10:53

Цитата:

Сообщение от xShift
почему вывод такой "нормальный"

Output несколько иной:
http://sandbox.onlinephpfunctions.co...e0418b43327c4b
Он именно такой, какой ожидается.
http://php.net/manual/ru/function.ltrim.php

laimas 21.07.2018 11:31

xShift,
вы хотите получить от функции то, что она не в состоянии сделать, и пофигу на какой платформе запускается.

xShift 21.07.2018 11:46

Nexus, блядь, дак я про это иговорю.

Mac OS:
ass="test"
le="javascript:"
=" javascript:"

Linux:
lass="test"
le="javascript:"
=" javascript:"


А про ве ваши попытки изолировать контекст и распаралелить вычисления я вам скажу одно - не занимайтесь хуйней. Вы защищаетесь от школоты, которая не может залезть в память. Дорогие intel подставили буквально все своими ебаными уязвимостями. И если вы например понимаете, что интегрированная в микросхему с корпусом закладка какого-то тачпада может просто по сигналу с андроид смартфона выполнить у вас код который вы никогда не вычислите для вас станет очевидным бесполезность классов.

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

Это все бред. Как мы выяснили или фактически догадались игру там ведут производители самого того без чего не работает электроника и эти закладки не хотят устранять потому что это контроль системы.

Благодаря таким-же хакерам и сплойтерам мы можем точно также конкурировать в среде заведомо скомпрометированной системы.

Но давайте просто будем разумными, честными людьми и за это нас никто убивать не будет. А игры в изоляцию лучше заканчивайте - спасетесь только от школоты и создадите себе трудностей.

xShift 21.07.2018 11:52

laimas, я больше не общаюсь с вами. даже не впечатление, а факт, что вы щас пытаетесь наебнуть на меня то, что доказать не в состоянии.

функция не должна вырезать сама по себе в разном виде один и тот же материал в одном и том же контексте.

Я вам щас сломаю одно ядро на процессоре и отправлю в эпоху x86. потому что кроме windows 7 вы после этого не установите ни чего. разозлился. Это будет вам урок.

laimas 21.07.2018 11:58

Цитата:

Сообщение от xShift
Я вам щас сломаю одно ядро на процессоре и отправлю в эпоху x86.

Да флаг вам в руки, ломайте.

xShift 21.07.2018 12:48

laimas, я вам намекал о том, что вы бракованный индивид, наряду со всеми остальными, но вы даже не захотели об этом задуматься. Вместо того, чтобы согласиться что проблема имеет место вы начнете искать не ее решение а пути обхода типа написания своего класса, функции, создания PRCE и так далее. Ошибка в системе не исправится, а куча ненужного появится.

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

Но вот за последние 100 лет от какого-то Попова и Теслы и их ебаных разработок все сука сломалось. И это была жалкая породия на то, что сюда было сделано миллионы лет назад.

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

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

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

Ты бы лучше так не говорил и не доказывал, коли не можешь.

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

Эти засранцы и меня точно также сломали. Я такой не был. Мне просто подъебали суперпозицию атома за то что я над ними посмеялся, когда нет ни 1 и нет 0. Вот мозги от этого взъебываются. Тебе без остановки накидывают неприятностей, которые влияют на твою жизнь а ты должен принять решение ноль ты или один. Будешь ты реагировать или нет и какие будут последствия от этого.

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

Все. Я ушел о вас. Мне не запрещают про эти вещи рассказывать, я как бы так и работаю.

А был бы я без ментов и федералов - я бы вам просто один раз свою кишку в извилины включил и потом как следует насрал прямо в мозг. Это проясняет сознание не хуже чем дискуссия с доказательством или прения депутатов :D

Удачи поцэ.


Часовой пояс GMT +3, время: 03:44.