Autor Zpráva
návštěvník
Profil *
Potřeboval bych poradit jak udělat hromadnou záměnu v řetězci. Řetězec je již profiltrovaný odstranil jsem z něj všechny znaky vyhovující předloze /\W/ a převedl jsem ho na lowercase. V řetězci potřebuju najít slova, která chci nahradit za hvězdičky. Klíčové pro mě je, že počet hvězdiček musí přesně odpovídat počtu alfanumerických znaků ve výskytu. Mám poměrně dlouhou sadu jednoduchých předloh něco jako array(0 => /[zn]?a?beh\w{1,2}// , 1 => /\w{1,3}v[iy]zd/ , ... )
to je jedno jaké předlohy si dosadíte. Jde tedy o to že nalezené slovo, když bude např. zabehnout , nabehnout nebo behat nebo hvizdat, hvizdnout, apod. musí být nahrazeno za odpovídající počet hvězdiček:
*******ut , *******ut nebo ***** nebo *****at, *****nout, *******at apod.
Jak takovou věc udělat? dá se to udělat pomocí preg_replace? Nebo použít preg_match_all, nasbírat výsledky, zaměnit výsledky za stejný počet hvězdiček a pak provést
$tx = preg_replace($preg_patterns,$stars_arr,$tx,-1,$count);
? A byl by na preg_match_all spoleh?
juriad
Profil
Pouzij preg_replace_callback. Zavola tvoji funkci s kazdym vyskytem. Ty ten vyskyt muzes libovolne upravit nebo zmenit.
návštěvník
Profil *
juriad:
Dělám to podle vzoru: Example #1 preg_replace_callback() and anonymous function
http://cz2.php.net/preg_replace_callback
a dostávám chybu
Parse error: syntax error, unexpected T_FUNCTION

$tx = preg_replace_callback(
        $patterns,
        function ($matches) {
            for($i=0; $i<count($matches); $i++):
              for($j=0; $i<strlen($matches[$i]); $j++):
                $matches[$i][$j]='*';
              endfor;
            endfor;  
            return $matches;
        },$tx,-1,$count);
Tori
Profil
návštěvník:
Jestli máte verzi PHP nižší než 5.3, tak si musíte vytvořit pojmenovanou funkci a předat její název jako řetězec. Anonym.fce fungují až od 5.3.
návštěvník
Profil *
Tori:
Díky už mi to funguje:

function makeTheStars ($matches) {
    for($i=0; $i<count($matches); $i++):
      for($j=0; $j<strlen($matches[$i]); $j++):
        $matches[$i][$j]='*';
      endfor;
    endfor;  
    return $matches[0];
};
$tx = preg_replace_callback($preg_patterns,'makeTheStars',$tx,-1,$count);

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0