NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
Martin Štěpánek :27.3.2017 18:52

Ahoj,
jde mi o nahrazení textu mezi tagy. Vím, že to půjde nějak jednoduše přes regex, ale ať se snažím sebevíc, tak mi to nejde.
Abych byl konkrétní uvedu to na příkladu:

<body>
<p>
<span class="error">error text<strong>strong error text</strong></span>
</p>
</body>

A potřebuji například nahradit slovo "strong" za "tučný", ale jen text, ne tag. Stejně tak potřebuji například nahradit slovo "error" za "chyba".
Výsledek takové operace by měl být:

<body>
<p>
<span class="error">chyba text<strong>tučný chyba text</strong></span>
</p>
</body>

Nahradilo to text, ale tag strong a class error by to nechalo být. Nevíte co s tím? :-)
Předem děkuji za pomoc.

Odpovědět
27.3.2017 18:52
Všechno jde naprogramovat, chce to jen čas a chuť...
Avatar
Jan Bezdíček
Tvůrce
Avatar
Odpovídá na Martin Štěpánek
Jan Bezdíček:27.3.2017 19:50

Co takhle radsi pouzit nejaky DOM parser ? viz. http://simplehtmldom.sourceforge.net/

 
Nahoru Odpovědět
27.3.2017 19:50
Avatar
Odpovídá na Jan Bezdíček
Martin Štěpánek :27.3.2017 20:13

Jak přesně? Promiň, moc si nedovedu představit, jak bych s tím měl pracovat... :-)
(vzhledem k nahrazování, s DOM umím pracovat)

Nahoru Odpovědět
27.3.2017 20:13
Všechno jde naprogramovat, chce to jen čas a chuť...
Avatar
Vorlagh
Člen
Avatar
Odpovídá na Martin Štěpánek
Vorlagh:28.3.2017 8:38

Pokud to správně chápu, měla by ti stačit obyčejná funkce např. z PSPadu "Hledat > Hledat/nahradit v souborech...", popr. to urcite bude umet i total commander apod.

 
Nahoru Odpovědět
28.3.2017 8:38
Avatar
Odpovídá na Vorlagh
Michal Haňáček:28.3.2017 10:30

To není možné, to by mu přepsalo i tagy.

Nahoru Odpovědět
28.3.2017 10:30
Každé rozhodnutí a každý krok v životě nás někam posune. Bohužel jen některé nás posouvají dopředu.
Avatar
Michal
Člen
Avatar
Odpovídá na Martin Štěpánek
Michal:28.3.2017 10:45

Ahoj, pokusil jsem se něco vytvořit, ale není to úplně dokonalé řešení.

$text = '<body><p><span class="error">error text<strong>strong error text</strong></span></p></body>';

$ignoreLeft = '"<'; // Budou se ignorovat slova, která předchází " nebo <
$ignoreRight = '">'; // a zároveň následuje " nebo >.


// Asociativní pole, kde klíč je původní slovo a hodnota nové slovo.
$translateMap = ['error' => 'chyba', 'strong' => 'tučný'];

// Projdou se všechna slova, která se mají přeložit.
foreach(array_keys($translateMap) as $word) {
   // Každé nalezené původní slovo se nahradí příslušným novým slovem.
   $text = preg_replace('/([^' . $ignoreLeft . '])' . $word . '([^' . $ignoreRight . '])/', '$1' . $translateMap[$word] .'$2', $text);
}
 
Nahoru Odpovědět
28.3.2017 10:45
Avatar
Vorlagh
Člen
Avatar
Odpovídá na Michal Haňáček
Vorlagh:28.3.2017 11:56

J moje chyba, myslel sem, že to umí i nějaký podmínky. Můžeš zkusit http://www.stahuj.centrum.cz/…madny-menic/ což sem rychle vygooglil

 
Nahoru Odpovědět
28.3.2017 11:56
Avatar
Odpovídá na Vorlagh
Martin Štěpánek :28.3.2017 15:03

Já potřebuji upravovat string v kódu...

Nahoru Odpovědět
28.3.2017 15:03
Všechno jde naprogramovat, chce to jen čas a chuť...
Avatar
Odpovídá na Michal
Martin Štěpánek :28.3.2017 15:04

Dík moc, večer zkusím :-)

Nahoru Odpovědět
28.3.2017 15:04
Všechno jde naprogramovat, chce to jen čas a chuť...
Avatar
Martin Štěpánek :1.4.2017 2:06

Tak nakonec po několika hodinách hledání jsem našel řešení :-D
Přikládám :-)

$content = preg_replace('#' . preg_quote($word) . '(?!([^<]+)?>)#i', $value, $content);
Akceptované řešení
+5 Zkušeností
Řešení problému
Nahoru Odpovědět
1.4.2017 2:06
Všechno jde naprogramovat, chce to jen čas a chuť...
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 10.