Usuwanie znaków ze stringów w php


(Lysy1033) #1

Witam. Chciałbym napisać funkcję która usuwałaby wszystkie znaczki ze stringa oprócz znaczków z np tablicy czy czegos. Chodzi mi o to że tekst który mam w jakiejś zmiennej powiedzmy $tekst będzie wykorzystany do tworzenia linków więc musze usunąć wszystkie znaczki oprócz cyfer i wszystkich angielskich literek. Da sie zrobić coś takiego?


(Panda2a) #2

Może tak ?

function noPolish($string='') { 

     $polish=chr(234).chr(243).chr(185).chr(156).chr(179).chr(191).chr(159).chr(230).chr(241). chr(202).chr(211).chr(165).chr(140).chr(163).chr(175).chr(143).chr(198).chr(209).chr(177). chr(182).chr(188). chr(161).chr(166).chr(172).chr(32); 

    $nopolish='eoaslzzcnEOASLZZCNaszASZ_'; 


    return strtr($string, $polish, $nopolish); 

}

(Lysy1033) #3

ok rozumiem a da sie zrobic tak zeby tez wywalalo wszystkie przecinki itd? chodzi mi zeby wywalalo wszystko oprocz nopolish?


(Panda2a) #4

Rozbuduj tablice o potrzebne ci znaki


(Lysy1033) #5

rozumiem rozwiazanie a czy nie da sie prosciej zrobic tak jak pisalem wyzej? chodzi o to ze ciezko przewidziec co kto wpisze. W praktyce docelowo ma byc tak ze ktos jak doda ogloszenie to tytul tego ogloszenia bedzie linkiem na liscie ogloszen i tytul ogloszenia ma tez trafic do adresu adresy przepisywane sa mod rewritem. nie chce zeby ktos wparowal mi z dziwnym znaczkiem i zeby potem jego ogloszenie sie nie otwieralo przez ten znaczek. zalezy mi zeby wszystkie znaczki nopolish zostawaly a reszta zeby byla usunieta


(Panda2a) #6

Pracuj, pracuj tu dodatkowa ściąga :

http://www.programuj.com/ascii.php

Jeśli nie wiesz jakią fantazje ma użytkownik musisz się ubezpieczyć na każdą ewentualność.


(Lysy1033) #7

ok rozbudowalem ale co ze znakami np chinskimi? jak ktos wejdzie na strone i zacznie pisac jakismis cudami? chyba bedzie lepszym pomyslem napisanie takiej funkcji ktora bedzie sprawdzac czy dany znak nalezy do nopolish jesli nalezy to go kopiuje jesli nie to go omija... moge Cie prosic o pomoc?


(Kutar 0) #8
preg_replace('/[\W_ążźćńśłóę]/i','',$string)

@EDIT:

Umik - mógłbyś dać spację w kodzie? bo się strasznie strona rozciągła.


(Lysy1033) #9

to dalej nic nie wnosi gdyż ogranicza się do podmieniania znaków. Mam taki pomysł żeby pobierać znak z ciagu sprawdzać czy taki znak jest na liscie znaków dozwolonych jeśli jest to go przekopiować do innego stringa jeśli go nie ma to nie kopiować itd...


(Kutar 0) #10

no i właśnie chyba to chciałeś osiągnąć. Warunek w preg_replace zostawia jedynie znaki, które są literami (zarówno małymi jak i wielkimi ) lub cyframi :stuck_out_tongue:


(Panda2a) #11

Nie poprawnie składniowo lecz łopatologicznie :wink:

<?


$string = "Łódź Wiąckowice 22";

$string2= preg_replace('/[\W_ążźćńśłóę]/i','',$string);

echo "$string2 \n 
";


function noPolish($string='') {

     $polish=chr(234).chr(243).chr(185).chr(156).chr(179).chr(191).chr(159).chr(230).chr(241). chr(202).chr(211).chr(165).chr(140).chr(163).chr(175).chr(143).chr(198).chr(209).chr(177). chr(182).chr(188). chr(161).chr(166).chr(172).chr(32);

    $nopolish='eoaslzzcnEOASLZZCNaszASZ_';


    return strtr($string, $polish, $nopolish);

}  

$string3=noPolish($string);

echo "$string3 \n 
";

?>

Odpal i sprawdź na czym polega różnica.

I to właśnie uzyskałeś.


(Lysy1033) #12

no rozumiem was ale dalej funkcja ogranicza sie do listy znakow niedozwolonych a chodzi mi o taka funkcje ktora nie ma takiej listy. jest tylko lista znakow dozwolonych. np jesli ktos wstawi jakis znaczek 'narodowy' np jakas japonska litere to funkcja ją przepusci jeśli jej nie będzie na liscie znaków niedozwolonych. Cały myk polega właśnie na tym żeby wybrać ze stringa tylko znaki z listy dozwolonych a reszte odrzucic. Mam nadzieje ze w miare jasno przekazałem moją myśl jeśli chodzi o taką funkcję.

Jeżeli ktoś doda znak z ascii o numerze 27 to jest ESC to funkcja napisana wyrzej go przepusci co dla mnie jest niedopuszczalne.

Algorytm na funkcje o której piszę był by taki:

Pobieram pierwszy znak ze stringu szukam czy jest w tablicy ze znakami dozwolonymi jesli jest kopiuje go do stringa2. i tak az do konca stringa. no wlasnie nie wiem jak to dobrze zrealizowac. Nie umiem nawet odwołać się do konkretnego znaku w stringu... może ktoś podpowie?


(Kutar 0) #13
function polish($string) {

$polish=array('a','b','c','d','e','f','g','h','i','j','k','l','m', 'n','o','p','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5','6','7','8','9');

$newstring='';

$ile=strlen($string);

for($a=0;$a<$ile;$a++)

{$letter=substr($string,0,1);

$string=substr($string,1);

if(in_array(strtolower($letter),$polish)) $newstring.=$letter;

}

return $newstring;

}

(Lysy1033) #14

ciekawa fonkcja. spełnia moje oczekiwania. w sumie liczylem tylko na podpowiedz lub jakas wskazowke mimo wszystko dziekuje za gotowca.


(Airborn) #15

np $str{4} odwołuje się do 5 znaku stringu :wink:

natomiast co do meritum, zastanawiam się, dlaczego się tak męczycie tam gdzie wystarczy linijka kodu:

$str = ereg_replace('[^0-9a-z]', '', $str);

czy w formie funkcji 3 linijki

function polish($str){

$str = ereg_replace('[^0-9a-z]', '', $str);

return $str;

}

(Kutar 0) #16

Napisałem parę postów wcześniej to samo, tylko że w składni Perla, ale się nie podobało. To napisałem funkcję o jaką lysy1033 poprosił.

@EDIT down:

spoko :slight_smile: hehe


(Airborn) #17

kutar wybacz, nie zauważyłem tego, rzuciły się na oczy same posty z dużymi spisami znaków, proste skuteczne i małe objętościowo rozwiązanie się po prostu zgubiło między nimi


(Lysy1033) #18

Przepraszam dopiero zaczynam łapać o co chodzi w wyrażeniach regularnych...