Jednoduchý regulární výraz pro nahrazení – Regulární výrazy – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Jednoduchý regulární výraz pro nahrazení – Regulární výrazy – Fórum – Programujte.comJednoduchý regulární výraz pro nahrazení – Regulární výrazy – Fórum – Programujte.com

 

fix0
Stálý člen
23. 9. 2019   #1
-
0
-

Ahoj všem, prosím o pomoc jak udělat v PHP, aby se libovolný počáteční tag body změnil ve zdrojovém kódu na jeho základní podobu pouze <body>.

Takže např.: "<body bgcolor="black" style="něco" cokoliv dalšího>" by se změnilo na pouhé "<body>".

Obecná maska by byla: "<body *>", kde hvězdička nahrazuje libovolné znaky s libovolným počtem znaků.

Použití budu mít ve své funkci deklarovanou takto: Nahradit("<body *>",$zdroj);, obecně Nahradit(CO,ČÍM);

Děkuji všem za pomoc.

Nahlásit jako SPAM
IP: 31.30.173.–
fix0
Stálý člen
23. 9. 2019   #2
-
0
-

#1 fix
Fungovalo by mi hádám něco jako:

<?php

$vyraz="'^[<body]' a zároveň '>$'";
$zdroj='<body bgcolor="black" style="něco" cokoliv dalšího>';
echo preg_replace($vyraz,$zdroj);

?>

Jak by to vypadalo správně?

Děkuji pěkně.

Nahlásit jako SPAM
IP: 31.30.173.–
peter
~ Anonymní uživatel
4016 příspěvků
23. 9. 2019   #3
-
+1
-
Zajímavé
fix +

Pises nesmysly. Prostuduj si aspon regexp.cz, kdyz uz nezkusis googlovat. Nevim, kde jsi sebral hvezdicky. To si asi pletes s dosem. 
. = libovolny znak
* = opakovani 0-nekonecno

<body bgcolor="black" style="něco" cokoliv dalšího>
<body>
\<body.*\>
\<body[^>]*\> lepe, pripadne mozna bez tech lomitek ti to mozna pujde take a nebo bude nutne
[<]body[^>]*[>]
Nahlásit jako SPAM
IP: 2001:718:2601:258:4dbc:3838:5a25:f2e0...–
peter
~ Anonymní uživatel
4016 příspěvků
23. 9. 2019   #4
-
0
-

   

$vyraz="'^[<body]' a zároveň '>$'";
To uz od pohledu vidis, ze je to nesmysl, preci, ne?
'^[<body]' a zároveň '>$' // bez dvojuvozovky
'[<body]' a zároveň '>' // bez zacatek a konec radku
A ted si poloz otazku, co tam delaji ty jednoduche apostrofy?
[<body] // a do hranate zavorky se pise vycet znaku
a[XYZ]b = aXb, aYb, aZb
[<body] = <, b, o, d, y 
[<body]* = <, b, o, d, y nebo jakakoliv kombinace znaku v zavorce <b, yd, oo, yy, <<

Regularni vyraz funguje tak, ze ma vzorec. Vyhledej string v retezci podle vzorce.

Nahlásit jako SPAM
IP: 2001:718:2601:258:4dbc:3838:5a25:f2e0...–
fix0
Stálý člen
23. 9. 2019   #5
-
0
-

Jak si přišel na to, že jsem nezkusil googlovat, právě, že to co jsem předložil byl výsledek googlování (myšleno obsah apostrofů vč. nich).

Podle návodu má tohle '^[<body]' být pravidlo, že nalezené musí začínat na <body a tohle '>$', že musí končit na >.

Co tam mám pořád špatně, že nedochází ke shodě? 

<?php

$vyraz='[<](body|BODY)[^>]*[>]';

$zdroj='<body nějaký nesmysl wd"sf w*aů|"ds >';

echo preg_replace($vyraz,$zdroj);

?>

Děkuji za vysvětlení regulární výrazy mi nikdy nešli a nesnáším je, využívám je jednou za 5 let, když nění zbytí jako třeba teď.

Nicméně stejně nechápu co jsi to vytvořil za výraz: [<]body[^>]*[>]

Chápu z něho, že zřejmě musí začínat na "<body" pak mít neomezené množství znaku ">" a končit druhým znakem ">". Ve shodě by tedy mělo být "<body >>","<body >>>", "<body >>>>"  atd. ale podle validátoru to tak není a je ve shodě i <body cokoliv>, což nechápu proč.

Protože:

[<] ... musí tvořit pouze jednoprvek složený z jednoho písmena abecedy, tedy "<", nic jiného

body ... Pevně napsaný řetězec, zřejmě nijak neměnný, ale nechápu, proč je [<] takto separováno v hranatých závorkách

[^>]* ... musí končit na libovolné opakování slova ">", ">>", ">>>", ...
[>] ... jelikož je to na konci, tak zas nevím co to tu dělá

Prostě děs.

Hvězdička není z DOS, ale ze všech systémů co jsem kdy měl v ruce (DOS,NT,UNIX,wildcard v síťařině, zástupný znak v systému DNS, prostě všude) :-D. Není nějaká funkce, do kterého bych mohl napsat jen zápis "str_replace(funkce(<body*>),$zdroj);" a on by si to na regulární výraz převedl sama? :-D



 

Nahlásit jako SPAM
IP: 31.30.173.–
Kit+15
Guru
23. 9. 2019   #6
-
+1
-
Zajímavé
fix +

#1 fix
Neparsuj to jako text, ale jako HTML.

Nahlásit jako SPAM
IP: 46.135.78.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
KIIV
~ Moderátor
+43
God of flame
24. 9. 2019   #7
-
+1
-
Zajímavé
fix +

#5 fix
[^>]* znamena vsechny znaky krome >. Kdyz bys tam mel jen  <body.*>, tak by to zlikvidovalo vsechno az do uplne posledniho > v cele radce. To proto, ze je .* takzvane greedy (nebo volne prelozeno hladove). Pokud to bude na vic radku, tak to bude potrebovat zapnout multiline regex a tak dale.

Nakonec se dostanes k tomu, ze bude opravdu lepsi pouzit nejaky html parser, jak radi Kit

Nahlásit jako SPAM
IP: 62.24.80.–
Program vždy dělá to co naprogramujete, ne to co chcete...
fix0
Stálý člen
24. 9. 2019   #8
-
0
-

#7 KIIV
Děkuji za vysvětlení, už to chápu.

Jen mi ten HTML parser přijde jako zbytečně složité řešení co vyžere paměť serveru, protože bych musel do parseru načíst vždy při návštěvě celý HTML dokument. Přijde mi to jako špatné řešení.

<body> přece nikdy nemá být přes více řádků.

Poptávám tedy spíše rady jak pomocí auto_preprend skriptu, který se volá vždy přímo na webserveru ještě před zpracováváním samotného webu, aby tento skript:

  1. Pomocí ob_start(); a již vytvořeného regulárního výrazu našel <body*>.
  2. Za tento nalezený počáteční <body*> tag by podstrčil na všechny mé weby HTML sdělení.

Může to takto fungovat?

Již mám hotové funkční řešení co počáteční <body*> tag nahrazuje, ale uvědomil jsem si, že je nesmysl ho nahrazovat, potřebuji přidávat svoje HTML, nikoliv odebírat původní body:

<?php
function callback($buffer)
{
	//return (str_replace('<body data-basepath="/joomla">', '<body data-basepath="/joomla">banner geekworld', $buffer));
	//nebylo by lepší nahradit str_replace za něco jako preg_replace?
	return (str_replace('<body>', '<body>moje HTML', $buffer)); 

}

ob_start("callback");
//do zápatí webu ještě strkám ukončení ob_end_flush();
?>


Zobecnit rexegem by se to hádám dalo nějak takto (můžete mi prosím třeba sdělit, jestli jsem správně pochopil, že $pattern je ten regulární výraz a co je potom ten $replacement? nejspíš je to zase nějaký ještě divnější regulární výraz, který říká co se má čím nahradit). Zkusím ještě najít další návody, ale prostě tohle se snad nikdy nenaučím. Ale věřím, že jsem již na dobré cestě z těch nejjednoduších cest a mělo by to takhle fungovat i bez HTML parserů apod.:

<?php
function callback($buffer)
{
	$string = $buffer;
	$pattern = '[<]body[^>]*[>]';
	$replacement = 'sem netuším co dát';
	echo preg_replace($pattern, $replacement, $string);
        //v prohlížeči by se mělo vypsat něco jako <html bla bla bla<body bla blasem netuším co dát bla bla bla</html>

}

ob_start("callback");
//do zápatí webu ještě strkám ukončení ob_end_flush();
?>

Že by snad nějak takhle? I když to asi ne, furt je to pattern, to by chtělo tu shodu s tím patternem napřed uložit do nějaké proměnné a pak ji tam zase vrátit s přílepkem toho mého HTML:

<?php
function callback($buffer)
{
	$htmlDocument = $buffer;
	$pattern = '[<]body[^>]*[>]';
	
        preg_match($pattern, $htmlDocument ,$matches)

        $puvodniBody = array_shift(array_values($matches));
        $replacement = "$puvodniBody . MOJE HTML";
	echo preg_replace($pattern, $replacement, $htmlDocument );
        //v prohlížeči by se mělo vypsat něco jako <html bla bla bla<body bla bla
MOJE HTML bla bla bla</html>


}

ob_start("callback");
//do zápatí webu ještě strkám ukončení ob_end_flush();
?>

Děkuji moc za rady.

Nahlásit jako SPAM
IP: 31.30.173.–
peter
~ Anonymní uživatel
4016 příspěvků
26. 9. 2019   #9
-
0
-

$vyraz='[<](body|BODY)[^>]*[>]'; // stale to mas spatne. Musis se naucit cist dokumentaci na php.net, fakt. Jinak se dal nehnes.

[<](body|BODY)[^>]*[>] - to je reg. vyraz
<body[^>]*> --- mozna by to fungovalo i takhle a jeste je treba tam pridat ohraniceni reg. vyrazu kvuli modifikator
/<body[^>]*>/ --- nebo
~<body[^>]*>~ --- a modifikator pro mala velka pismena 'i'
~<body[^>]*>~I --- mno, a kdyz to mas hotove, pak z toho musis udelat php string
'~<body[^>]*>~I'

$vyraz = '~<body[^>]*>~I';

i znamena, ze bude uvazovat mala velka pismena
[] oznaceni mnoziny znaku
[<] pouze znak <
[^>] mnozina vsech znaku krome >
[^abc] krome abc
… to mas ale vypsane na tom regexp.cz


Fakt, regularni vyrazy je snadne pochopit. Neni to takova zahada.
body|BODY - body nebo BODY
b|B - b nebo B
[bB] - b nebo B
bB - bB oba znaky, podobne jako slovo body
[bB]+ - opakovani znaku b nebo B nebo kombinace, v poctu 1 az nekonecno (+)
[bB]* - opakovani znaku b nebo B nebo kombinace, v poctu 0 az nekonecno (*)
[bB]? - opakovani znaku b nebo B nebo kombinace, v poctu 1 (?)
b - znak b
b? - znak b
b+ - znak b nebo bb, bbb, bbbb…
b* - nic nebo znak b, bb, bbb...
 

Nahlásit jako SPAM
IP: 2001:718:2601:258:4dbc:3838:5a25:f2e0...–
peter
~ Anonymní uživatel
4016 příspěvků
26. 9. 2019   #10
-
0
-

Zajimave, fotko to icko zmenilo na svislou carku | nebo mozna velke I
 

priklady vyrazu https://www.php.net/preg_replace
tam je See Also: PCRE Patterns 
- modificatory: https://www.php.net/manual/en/reference.pcre.pattern.modifiers.php
- syntaxe https://www.php.net/manual/en/reference.pcre.pattern.syntax.php

mozna tam bude treba dat jeste modifikator m a g
 

'~<body[^>]*>~im

// i (PCRE_CASELESS) =  pattern match both upper and lower case letters
Nahlásit jako SPAM
IP: 2001:718:2601:258:4dbc:3838:5a25:f2e0...–
Martin Fiala
~ Anonymní uživatel
8 příspěvků
16. 1. 2020   #11
-
0
-
Nahlásit jako SPAM
IP: 37.188.157.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 3 hosté

Podobná vlákna

Regulární výraz(jednoduchý) — založil CZechBoY

Regularni vyraz pro komentar — založil pedro.cze

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý