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.