Autor | Zpráva | ||
---|---|---|---|
Patrikulátor Profil * |
#1 · Zasláno: 4. 3. 2016, 08:05:57
Mám v proměnné nějaký text včetně HTML tagů a potřebuji pro své účely proměňovat všechny výskyty " a ' na entity s podmínkou, aby se změna nedotkla žádných tagů < ... > tam ať ty uvozovky a apostrofy zůstanou jak jsou.... Neumím setavit regulár pro preg_replace , ...... htmlspecialchars () mi tady nepomůže :( Díky za tipy
|
||
RastyAmateur Profil |
Patrikulátor:
Pokud to dobře chápu, tak ti jednoduše řečeno jde o to, abys přepsal " a ' na entity. Nestačilo by str_replace()? Počkej, už to chápu. Mimo HTML tagy přeměnit, jindy ne? |
||
Keeehi Profil |
#3 · Zasláno: 4. 3. 2016, 09:59:39
Patrikulátor:
Problém je, že HTML není regulární jazyk a není tedy možné napsat takový regulární výraz, který by pokryl všechny možnosti. Potřebuješ na to něco silnějšího. github.com/nette/tokenizer nebo php.net/manual/en/book.simplexml.php nebo php.net/manual/en/book.dom.php |
||
Časová prodleva: 3 dny
|
|||
Alphard Profil |
#4 · Zasláno: 7. 3. 2016, 12:03:08
Tokenizer je určitě dobrá volba, zajistí validaci a robustnost, bohužel je implementačně náročnější.
Pro docela jednoduchou věc, jako nahrazení textu mimo <tagy> , by mohl stačit i triviální parser jako např. tento náčrt. Záleží na situaci, k čemu se to použije.
function replaceNonHtml($input, callable $replaceFcn) { $endPos = strlen($input); $currPos = 0; $output = ''; while (($startTagPos = strpos($input, '<', $currPos)) !== false) { $endTagPos = strpos($input, '>', $startTagPos) ?: $endPos; $output .= $replaceFcn(substr($input, $currPos, $startTagPos-$currPos)); $output .= substr($input, $startTagPos, $endTagPos-$startTagPos); $currPos = $endTagPos; } $output .= $replaceFcn(substr($input, $currPos, $endPos-$currPos)); return $output; } |
||
Martin2 Profil * |
#5 · Zasláno: 8. 3. 2016, 12:16:16
Patrikulátor:
„potřebuji pro své účely proměňovat všechny výskyty " a ' na entity“ Existuje k tomu nějaký důvod? S výjimkou snad escapování ostrých závorek v HTML jsou entity něco, co není důvod používat. |
||
Časová prodleva: 8 let
|
0