darsga qaytish

Boshdan keyin kiriting

Bizda HTML hujjati bo’lgan qator mavjud.

<body> tegidan keyin darhol <h1>Salom</h1> qo`shiladigan oddiy iborani yozing. Teg atributlarga ega bo’lishi mumkin.

Masalan:

let regexp = /sizning muntazam ifodangiz/;

let str = `
<html>
  <body style="height: 200px">
  ...
  </body>
</html>
`;

str = str.replace(regexp, `<h1>Salom</h1>`);

Shundan so’ng “str” ​​qiymati quyidagicha bo’lishi kerak:

<html>
  <body style="height: 200px">
    <h1>Salom</h1>
    ...
  </body>
</html>

<body> teg’idan keyin qo’shish uchun avval uni topishimiz kerak. Buning uchun <body.*?> muntazam ifoda naqshidan foydalanishimiz mumkin.

Ushbu vazifada biz <body> teg’ini o’zgartirishimiz shart emas. Faqat undan keyin matn qo’shishimiz kerak.

Buni qanday qilishimiz mumkin:

let str = '...<body style="...">...';
str = str.replace(/<body.*?>/, '$&<h1>Salom</h1>');

alert(str); // ...<body style="..."><h1>Salom</h1>...

Almashtirish satrida $& moslikning o’zini anglatadi, ya’ni <body.*?> ga mos keladigan manba matn qismi. U o’zi va <h1>Salom</h1> bilan almashtiriladi.

Muqobil variant orqaga qarashdan foydalanishdir:

let str = '...<body style="...">...';
str = str.replace(/(?<=<body.*?>)/, `<h1>Salom</h1>`);

alert(str); // ...<body style="..."><h1>Salom</h1>...

Ko’rib turganimizdek, bu regexpda faqat orqaga qarash qismi bor.

U quyidagicha ishlaydi:

  • Matndagi har bir pozitsiyada.
  • U <body.*?> bilan boshlanganini tekshiradi.
  • Agar shunday bo’lsa, bizda moslik bor.

<body.*?> tegi qaytarilmaydi. Ushbu regexp natijasi tom ma’noda bo’sh satrdir, lekin u faqat <body.*?> bilan boshlangan pozitsiyalarda mos keladi.

Shunday qilib, u <body.*?> bilan boshlangan "bo’sh qator"ni <h1>Salom</h1> bilan almashtiradi. Bu <body> dan keyin qo’shishdir.

P.S. s va i kabi regexp bayroqlari ham foydali bo’lishi mumkin: /<body.*?>/si. s bayrog’i nuqta . ni yangi qator belgisiga mos kelishini ta’minlaydi va i bayrog’i <body> ni <BODY> ga ham katta-kichik harflarni farqlamasdan mos kelishini ta’minlaydi.