Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Обрезать HTML! (https://javascript.ru/forum/misc/78239-obrezat-html.html)

Роман Андреевич 14.08.2019 15:24

Обрезать HTML!
 
Коллеги, доброго времени суток, парюсь с регулярками, прошу помощи.
Есть строка в виде html документа:

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<header>
		<div class="log">123</div>
		<nav>...</nav>
	</header>
	<main>
		<!-- some content -->
	</main>
	<footer>
		<p>
			Lorem ipsum dolor sit amet, consectetur adipisicing elit. Non neque ab qui soluta harum consequuntur earum facilis. Pariatur, quia optio iste, excepturi corporis nesciunt, consequuntur, exercitationem incidunt labore eius voluptas.
		</p>
		<a href="#"></a>
	</footer>
</body>
</html>

надо из него вырезать все, вокруг тега main, т.е. остается только:
let str = `<main><!-- some content --></main>`;


Заранее благодарствую.

ksa 14.08.2019 15:56

Цитата:

Сообщение от Роман Андреевич
надо из него вырезать все, вокруг тега main, т.е. остается только:
let str = `<main><!-- some content --></main>`;

Оно?
var str='Лишний текст ... <main><!-- some content --\></main> ... продолжение лишнее';
alert(str.match(/<main>.*<\/main>/));

Роман Андреевич 14.08.2019 16:08

ksa, да спасибо

Роман Андреевич 14.08.2019 16:40

ksa, беда, не оно(((

Вот входная строка:

<!DOCTYPE html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="robots" content="noindex">
    <meta name="X-Robots-Tag" content="noindex">
    <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1">
</head>
<body data-country="">
<header role="banner" class="nav-header">
        </div>
    </div>
    <title>Ticket de RAPIPAGO</title>
</header>
<div class="ticket-box ticket-box-c2">
/--------------------------------------------------------------- от сюда 
    <div class="payment-info-container-c2">
        <div class="header-ticket">
            <!-- incluye el header del ticket -->
<div class="ticket-header">
    <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAnYAAACqCAYAAAAgNwKEAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAPzxJREFUeNrsnU+MFNe97w+ECOfKwBDZ9wpIrhtHNwZnwWAnbGyLRmZlxWJmESm2FBgi2VkEBZAj+fI2M7MJshQLJvJb3ESCGSLZvspiBtnXKywa2dmQODSLxMRPgfbj2ujFVhiMdYMVJX71rTpnpqa6qrrOn/rb36/UHgzT3VXnnKrzqd/fVZ9//rmgKIqiKIqi6q9VBDuKoiiKoiiCHUVRFEVRFEWwoyiKoiiKogh2FEVRFEVRFMGOoiiKoihq6MFu1apVHKmStO2h50e9HyPyf9uhf7rPe7Uiv47fG8340Yveqxvz9/i7WzG/07vyuxd6nBGKoiiKKkeZmI1gVzq4tUNAtkH+1AG0oqVgDz8vh/6f4EdRFEVRBLuhAriWfO0O/blp6oSgr0PgoyiKoiiCXd0hDtY2gNwOEVjeRod8SJRV74L82fFgb5ErhaIoiqIIdlUEubYEud1iZRycU/1j7Vpx5557lv7/f7Zsif29pL9X+uLt2+KLn3wy8O//6YMP7e11Dg6wnVJDrUxFt2AaEogh03+KrCHeLtyk6Sm/Xm/CAnhCLYNQP6FOCpnzvEcoZVlZI1OiGAe18sW+IWmalKUU7ADtfUUUJd4XOD++zpEu+3hDqKYDeE8BeFvJZITtzYMeDpExB2awC8+WLsG0U5g4dBgfq4Lmfofi1tfnDPnBfFe1IYS0kR7CiKoigqJ8BThYXzds0C4A+mFjqmKIIdRVEURVnDneoccTgHwIO7fcZ7nWQBYopgR1EURVHFQp6rLkRdCXQLBDqKYEdRFEVR5UMe4pxVhQMVy9wS/fHOnRDMXRZBsekeB5CqDNhRFEVRFEVR1RfBjqIoiqIoimBHURRFURRFEewoiqIoiqIogh1FURRFURRFsKMoiqIoimq0/r8AAwA8zR5enm5XSAAAAABJRU5ErkJggg==" height="27">
</div>
        </div>

        <div>
            <div class="principal-info">
                <!-- informacion propia del ticket -->
                
<h1 class="payment-info">Solo te queda pagar $ 156,00 en tu sucursal de Rapipago m&aacute;s cercana</h1>

<p>D&iacute;ctale estos n&uacute;meros al cajero:</p>
<div class="payment-secondary-info"></div>
<div class="payment-code-c2">
    <span>2084</span><span>0846</span>
</div>


    <br />
    <p>Tienes hasta el 19/08/2019 para hacerlo.</p>


<!-- incluye el div concepto -->
<div class="rapipago-item-time-accreditation item-time-accreditation">
    <i class="ch-icon-time"></i> Acreditaci�n inmediata.
</div>

<!-- incluye el barcode -->

    <div class="payment-barcode">
        <img src="data:image/png;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a
HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy
MjIyMjIyMjIyMjv8A3H13/wAbf+Rn13/sVLf/ANOUdcBqP/Mx/wDYqaV/7j67/wCN
v/Iz67/2Klv/AOnKOgA+IH/NYv8AuC/+y0f/AD1aPiB/zWL/ALgv/stH/wA9WgA07/k4Xw5/3Ff/
AEr1CsCx/wCQH8FP+wrcf+lsdb+nf8nC+HP+4r/6V6hWBY/8gP4Kf9hW4/8AS2OgDn/AP/IseIv+
B/8Apt1KvX5f+Sh+PP8AsK+G/wD0bFXkHgH/AJFjxF/wP/026lXr8v8AyUPx5/2FfDf/AKNioAPi
Z/yTz4k/9hW0/wDRVjXAaV/yHNK/7CvhT/0ieu/+Jn/JPPiT/wBhW0/9FWNcBpX/ACHNK/7CvhT/
ANInoA39R/5OF8R/9wr/ANK9Pr0D4Jf8kh0L/t4/9KJK8/1H/k4XxH/3Cv8A0r0+vQPgl/ySHQv+
3j/0okoA9AooooA//9k=" width="300px">
        <span>6001908196005001966315040000208408450000156006</span>
    </div>
<p class="rapipago-msg_after">Este comprobante es v&aacute;lido para pagar en los locales de la Red Rapipago en todo el pa&iacute;s.</p>
            </div>
            <input id="payment-detail-widget" class="payment-detail-widget" type="checkbox" checked/>
<div class="div-concept">
        <label for="payment-detail-widget">
            <span>Concepto</span>
        </label>
        <div class="ch-expandable-container purchases-expandable-container-c2" aria-expanded="true">
            <div class="payment-container-c2">
                <p class="buyed"><span></span>Compraste</p>
                    <p class="payment-reason-c2">Awesome Bronze Shoes</p>
                <p class="payment-price-c2"><strong class="ch-price">$ 156,00</strong></p>
            </div>
        </div>
</div>
        </div>
        <div class="more-info">
            <!-- incluye el boton imprimir -->
            <a class="payment-button-print btn-ticket" onclick="javascript:top.focus();
window.print()" href="#">Imprimir</a>
        </div>
    </div>

/------------------------------------до сюда
    <br/>
</div>

<footer role="contentinfo" class="nav-footer">
    <div class="nav-bounds">
        <div class="nav-footer-primaryinfo">
    </div>
</footer>

<script type="application/javascript">
   
</script>
</body>
</html>


нужно получить то что я выделил дефисами в коде, вроде бы правильное было решение у вас, но тут не работает оно. please help!!! Заранее благодарю

ksa 15.08.2019 07:45

Роман Андреевич, можно использовать тот факт, что нужный тебе кусок начинается с
<div class="ticket-box ticket-box-c2">

и заканчивается
<br/>
</div>
 
<footer role="contentinfo" class="nav-footer">

Условно назову их левой и правой скобками...
Т.о. твое решение может выглядеть так
var str='Лишний текст ... левая скобка<!-- some content --\>правая скобка ... продолжение лишнее';
alert(str.match(/левая скобка(.*)правая скобка/)[1]);

ksa 15.08.2019 08:15

Роман Андреевич, посмотрел я еще раз твою "строку"...
Оказывается тебе нужно содержимое
<div class="ticket-box ticket-box-c2">
...
</div>

Т.о. тебе и регулярка не нужна. :no:
Получай данные как html и работай с ними стандартными методами
obj=html.querySelector('.ticket-box.ticket-box-c2');

ksa 15.08.2019 08:57

Роман Андреевич, поместил твой текст в файл tmp1.csp...
Правда он был не валидный. :( Один ДИВ был не закрыт, я закрыл...

Вот еще один вариант решения. ;)

<!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(){
	$.ajax({
		url: 'tmp1.csp',
		success: function(Text){
			obj=$('<div></div>').html(Text);
			obj=obj.find('.ticket-box.ticket-box-c2');
			alert(obj.html());
		}
	});
});
</script>
</head>
<body>
</body>
</html>

Роман Андреевич 20.08.2019 06:52

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

j0hnik 20.08.2019 16:51

Роман Андреевич,
мб сразу с сервером и работать? нужное вам вынести отдельным объектом

j0hnik 20.08.2019 16:58

большинство спрашивающих думают что сервер это неведомая ..., которая рандомно выплевывает неведомую ... :stop:


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