Vložení za hlavičku
Máme řetězec s HTML dokumentem.
Napište regulární výraz, který vloží <h1>Ahoj</h1> hned za značku <body>. Tato značka může obsahovat atributy.
Například:
let rv = /váš regulární výraz/;
let řetězec = `
<html>
<body style="height: 200px">
...
</body>
</html>
`;
řetězec = řetězec.replace(rv, `<h1>Ahoj</h1>`);
Pak by hodnota proměnné řetězec měla být následující:
<html>
<body style="height: 200px"><h1>Ahoj</h1>
...
</body>
</html>
Abychom něco vložili za značku <body>, musíme ji napřed najít. Můžeme k tomu použít vzor regulárního výrazu <body.*?>.
V této úloze nemusíme měnit značku <body>. Potřebujeme jen vložit text za ni.
Můžeme to udělat následovně:
let řetězec = '...<body style="...">...';
řetězec = řetězec.replace(/<body.*?>/, '$&<h1>Ahoj</h1>');
alert(řetězec); // ...<body style="..."><h1>Ahoj</h1>...
V nahrazovacím řetězci $& znamená samotnou shodu, tedy část zdrojového textu, která odpovídá <body.*?>. Bude nahrazena sama sebou plus <h1>Ahoj</h1>.
Alternativou je použít zpětné nahlédnutí:
let řetězec = '...<body style="...">...';
řetězec = řetězec.replace(/(?<=<body.*?>)/, `<h1>Ahoj</h1>`);
alert(řetězec); // ...<body style="..."><h1>Ahoj</h1>...
Jak vidíte, tento regulární výraz obsahuje pouze nahlížecí část.
Funguje následovně:
- Na každé pozici v textu.
- Ověří, zda jí předchází
<body.*?>. - Pokud ano, máme shodu.
Značka <body.*?> nebude vrácena. Výsledkem tohoto RV je doslova prázdný řetězec, ale shoda se najde jen na pozicích, před kterými se nachází <body.*?>.
Nahrazuje tedy „prázdný řádek“, jemuž předchází <body.*?>, za <h1>Ahoj</h1>. To je vložení za <body>.
P.S. Užitečné mohou být i příznaky RV, konkrétně s nebo i: /<body.*?>/si. Příznak s způsobí, že tečka . najde znak nového řádku, a příznak i způsobí, že <body> najde i <BODY> bez ohledu na malá a velká písmena.