P3 38-52

PHP P1 – canalul youtube thenewboston – phpacademy – 200 vids Vid 38-52

- 38 – Introducere in vectori, array

Un vector este o colectie de date.

Daca la un moment dat am avea nevoie de mai multe numere, sa spunem

5, 10, 15, 20

si dorim sa le folosim pe toate atunci ne este de mai mult folos sa le avem stocate pe toate in acelasi loc.

Este util sa lucram cu vectori pentru ca pot fi usor accesati in interiorul buclelor unde la fiecare iteratie poate fi accesat un element din vector.

Vom crea o variabila vector

<?php
$food = array('Pasta', 'Pizza', 'Salad');
 // sunt 3 elemente in vector, 3 siruri de caractere, 'Pasta' pe pozitia 0, 'Pizza' pe pozitia 1, 'Salad' pe pozitia 2
echo $food[0];
echo $food[2];
// Se va afisa primul si al treilea element din vector PastaSalad
?>

Daca insa ne dorim sa afisam mai multe detalii despre vectori atunci vom folosi instructiunea de afisare print_r()

 <?php
$food = array('Pasta', 'Pizza', 'Salad');
print_r($food);
?>

 

Se va afisa

array ( [0] => Pasta [1] => Pizza [2] => Salad )

Acum se poate vedea mult mai clar care sunt indicii si valorile corespunzatoare

Daca am fi incercat sa afisam simplu prin intermediul lui echo ar fi afisat doar Array asta insemnand ca are de a face cu un vector insa nu mai mult pentru ca echo nu stie sa afiseze vectori.

 

Se pot introduce elemente in vector chiar in definirea vectorului:

$food = array(‘Pasta’, ‘Pizza’, ‘Salad’,’Vegetables’);

in acest caz a fost adaugat elementul ‘Vegetables’ pe pozitia 4 si avand indicele 3

sau

$food[4]=’Fruit';

care inseamna ca indicelui 4 din vector i-a fost asociata valoarea ‘Fruit’. Dar in vector nu exista un element cu indicele 4 asa ca automat a fost creat unul.

Aceasta metoda este cea mai utila pentru adaugarea de elemente in vectori fiind folosita mai ales in bucle.

 

- 39 – Vectori asociativi

Sa luam exemplul anterior in care avem 4 tipuri de mancare stocate ca valori intr-un vector

 <?php
$food = array('Pasta', 'Pizza', 'Salad','Vegetables');
print_r ($food);
?>

continutul vectorului este de forma

Array ( [0] => Pasta [1] => Pizza [2] => Salad [3] => Vegetables )

Dar sa presupunem ca dorim ca fiecarei grupe de alimente sa-i asociem o valoare nutritiva, numarul de calorii

<?php
$food = array('Pasta'=>300, 'Pizza'=>1000, 'Salad'=>150, 'Vegetables'=>50);
print_r($food);
?>

Se va afisa

Array ( [Pasta] => 300 [Pizza] => 1000 [Salad] => 150 [Vegetables] => 50 )

Asta inseamna ca de aceasta data alimentele sunt pe post de indici iar valorile stocate sunt numarul de calorii.

Pana acum accesam elementele din vector $food[0], $food[1]…Acum daca incercam acelasi lucru nu mai obtinem nimic pentru ca de aceasta data indicii sunt valori text.

Astfel pentru primul elemente din vector nu vom incerca $food[0] ci $food[‘Pasta’] si vom obtine valoarea 300.

 echo $food['Pasta'];
va afisa 300
 echo $food['Pizza'];
va afisa 1000

Vectorii asociativi sunt foarte utili in lucrul cu baze de date sau in prelularea informatiilor din formulare.

 

- 40 – Vectori bidimensionali

se mai poate reformula: vectori in interiorul altor vectori.

Sa revenim la exemplul anterior cu tipurile de mancare

$food = array(‘Pasta’=>300, ‘Pizza’=>1000, ‘Salad’=>150, ‘Vegetables’=>50);

In loc de a avea elemente in interiorul vectorului vom avea alti vectori. Si e bine sa ne gandim la acestia ca la niste categorii. Adica vom avea un vector de categorii de elemente

Sa categorisim alimentele in functie de cat de sanatoase sunt:

- Healthy
Salad
Vegetable
Pasta

- Unhealthy
Pizza
Ice cream

Vom avea un vector pe pozitia Healty si al vector Unhealthy

$food=array( ‘Healthy’=>array(), ‘Unhealthy’=array() );

apoi vom putea insera in fiecare vector elementele corespunzatoare

<?php
$food=array(
'Healthy'=>
array('Salad','Vegetable','Pasta'),
'Unhealthy'=>
array('Pizza','Ice cream') );
?>

– au fost aranjate pentru a pune in evidenta categoriile dar pot fi scrise oricum, pe o singura linie sau mai multe

Sa afisam un element din vector, sa luam ‘Pasta’

<?php
echo $food['Healty'] [2];
?>
afiseaza Pasta

Vom folosi doi indici, primul desemneaza categoria si al doilea alege elementul din vectorul categorie.

Sa luam un alt exemplu, ‘Ice cream': face parte din vectorul ‘Unhealty’ si e pe pozitia 2 (indicele 1)

 <?php
echo $food['Unhealty'] [1];
?>

 

- 41 – Instructiunea de ciclare foreach()

Parcurge vectorul luand pe rand fiecare element al acestuia si le atribuie varibilelor desemnate intre paranteze

Exista sub doua forme:

1. nu se citeste si indicele

 foreach($nume_vector as $element)
{
bloc de instructiuni
}

 

2. se citeste si indicele

 foreach($nume_vector as $indice => $element)
{
bloc de instructiuni
}

Se porneste de la inceputul vectorului $nume_vector si se culege fiecare element al vectorului in variabila $element (iar indicele in $indice). In blocul de instructiuni urmeaza sa fie prelucrate elementele.

Sa afisam continutul vectorului definit anterior:

 <?php
$food=array(
'Healthy'=>
array('Salad','Vegetable','Pasta'),
'Unhealthy'=>
array('Pizza','Ice cream') );

foreach($food as $category => $inner_array)
{
echo $category.'<br>';
}
?>
 Va afisa Healthy Unhealthy

Dorim sa afisam si elementele din vectorii corespunzatori categoriilor

foreach($food as $category => $inner_array)
{
echo $category.'<br>';
echo $inner_array.'<br>';
}
?>
Se va afisa
Healthy Array Unhealthy Array

De ce nu afiseaza si vectorii ci doar afiseaza Array? Pentru ca $inner_array fiind vector nu poate fi afisat cu echo. De aceea il vom afisa tot cu foreach.

<?php
foreach($food as $category => $inner_array)
{
echo $category.'<br>';

foreach($inner_array as $item)
 {
   echo $item.'<br>';
 }
}
?>

Va afisa

Healthy Salad Vegetable Pasta Unhealthy Pizza Ice cream

Nu se distinge prea bine unde incepe al doilea vector asa ca vom pune in evidenta denumirile categoriilor folosind tag-ul <strong>

 <?php
foreach($food as $category => $inner_array)
{
echo '<strong>'.$category.'<strong><br>';

 foreach($inner_array as $item)
 {
  echo $item.'<br>';
 }
}
?>

 

Healthy Salad Vegetable Pasta Unhealthy Pizza Ice cream

 

- 42 – functiile include() si require()

Functia include() se foloseste atunci cand se doreste ca tot ce se afla intr-un fisier, HTML si/sau PHP, sa fie inclus intr-un alt fisier.

De exemplu avem un fisier care contine header-ul pentru o pagina web si ne dorim ca acel header sa se regaseasca pe fiecare pagina a site-ului. Copierea textului duce la marirea dimensiunilor fisierelor si nici nu e eficienta asa ca se poate realiza acelasi lucru folosind include().

avem un fisier header.php care contine un titlu

<h2>My page</h2>

Cum putem crea mai multe pagini cu acelasi header in interiorul lor. Cum se procedeaza pentru o pagina asa se va proceda si pentru celelalte. Vom crea un fisier denumit index.php si un altul anotherpage.php

index.php:

 <?php
$var= 'String';
echo $var;
?>

 

anotherpage.php

 <?php
$var = 10;
echo $var;
?>

 

Vom modifica continului lui index.php astfel incat sa contina si fisierul header.php

index.php;

 <?php
include 'header.php';
$var= 'String';
echo $var;
?>

daca header.php se afla pe un nivel mai sus vom scrie

include ‘../header.php';

daca se afla intr-un alt folder

include ‘folder/header.php';

 

vom proceda la fel si pentru anotherpage.php

<?php

include 'header.php';
$var = 10;
echo $var;
?>

In acest fel titlul My page se va regasi pe fiecare pagina chiar daca fiecare pagina se comporta diferit, avand functionalitate diferita.

Mai mult, daca vom schimba continutul lui header.php aceasta schimbare se va regasi in ambele fisiere php, index.php si anotherpage.php. Fara include ar fi trebuit sa modificam fiecare fisier in parte.

In acest mod a fost creat un template, un model de pagina care poat fi modificat cu usurinta intr-un singur loc astfel incat modificarile sa fie vizibile in oricare din pagini.

Pot fi incluse in acest mod fisiere meniu, fisiere bara laterala, fisiere cu aplicatii, cu html sau cu php si pot fi incluse oricate fisiere sunt necesare.

Mai mult de atat, in header.php pot fi declarate si variabile:

 <h2>My page</h2>
<?php
$var1 = 'String';
$var2 = 10;
?>

 

E suficient sa includem header.php in ambele fisiere index.php si anotherpage.php pentru a avea acces la variabilele din ambele fisiere.

index.php:

<?php
include 'header.php';
echo $var1;
?>

 

anotherpage.php:

<?php
include 'header.php';
echo $var2;
?>

 

Va afisa String respectiv 10

pentru ca ambele valori au fost preluate din fisierul header.php

Dar ce se intampla daca dintr-un anumit motiv fisierul header nu ar exista? Toate valorile declarate in el nu ar mai fi accesibile in fisierul care il include deci pagina nu ar mai avea rost sa fie rulata. Pentru a opri executia script-ului atunci cand nu se gaseste un fisier se foloseste functia require();

Nu se observa nici o schimbare in cazul lui require(‘header.php’) fata de include(‘header.php’) insa sa luam situatia cand fisierul de inclus nu exista.

 <?php
include ('doesntexist.php');
echo 'Var2 is'. $var2;
?>

Afiseaza cateva notificari dar nici o eroare care sa opreasca scriptul si se afiseaza pe ultima linie Var2 is

insa daca vom folosi require()

<?php
include ('doesntexist.php');
echo 'Var2 is'. $var2;
?>

atunci pe langa notificari se afiseaza “Fatal error” iar scriptul este oprit si nu se mai afiseaza nici textul de la instructiunea echo.

Rostul unei astfel de instructiuni apare atunci cand anumite informatii din fisierul header sunt absolut necesare pentru rularea paginii, in lipsa acestuia rularea paginii ne mai avand rost.

Include e mai mult pentru design. Daca nu sunt gasite elementele de HTML nu e ceva grav. De exemplu un site poate sa functioneze chiar daca nu gaseste un meniu, se incarca restul paginii si va functiona chiar si partial.

 – 43 – include_once si require_once

Nu este nici o diferenta fata de include sau require daca se foloseste o data in interiorul paginii. Diferentele apar daca se incearca folosirea aceluiasi fisier php de mai multe ori.

 <?php
require('header.php');
require('header.php');
?>
Va afisa continutul lui header.php de doua ori
My page
My page

Daca insa folosim require_once atunci nu se mai include header.php si a doua oara. Va verifica daca header.php a fost deja inclus si il va include doar daca nu a fost deja inclus.

 <?php
require('header.php');
require_once('header.php');
?>

include_once are aceeasii semnificatie, adica nu mai include a doua oara fisierul deja inclus.

La ce ar putea folosi require_one si include_once? Atunci cand avem multe fisiere e posibil sa nu mai stim de cate ori am inclus un anumit fisier si in care fisier s-a intamplat asta. Cu include_once ne asiguram ca nu l-am inclus de mai multe ori din greseala.

 

 – 44 – preg_match() Pattern Matching

Consta in verificarea unui sir de caractere  daca corespunde unui anumit model.

Desi preg_match are foarte multe aplicabilitati si variante de verificare a sirurilor dupa anumite modele, vom testa doar capacitatea lui de cautare a unui sir in alt sir.

Dorim sa cautam un sir (“is”) in interiorul sirului “This is a string”.

 <?php
$string = 'This is a string.';
if(preg_match('/is/',$string ) )
{
echo 'Match found';
}
else
{
echo 'No match found';
}
?>

Va afisa Match found

pentru ca exista sirul ‘is’ in sirul continut de $string (‘This is a string’)

Se poate observa modul cum este data expresia de cautare:

de forma /sir de cautat/

Se poate verifica daca exista spatiu intr-un sir si atunci expresia de cautare este de forma 2 slash-uri cu un spatiu intre ele

‘/ /’

Vom crea o functie care va primi ca parametru un sir si il va verifica cu ajutorul functiei preg_match. Verificam daca sirul primit ca parametru contine macar un spatiu. Daca contine un spatiu functia returneaza true iar daca nu returneaza false.

 <?php

function has_space($string)
{
 if(preg_match('/ /', $string) )
  {
   return true;
  }
   else
  {
   return false;
  }
}

$string = 'Thisdoesnthasaspace';

  if(has_space($string))
   {
   echo 'Has a space';
   }
   else
  {
    echo 'Has no spaces';
  }
?>

 

Afiseaza
Has no spaces

pentru ca sirul $string  ‘Thisdoesnthasaspace’ nu contine nici un spatiu

Daca am da variabilei $string o valoare ‘This doesn/’t have a space’ care contine macar un spatiu (de fapt mai multe spatii) atunci se va afisa

Has a space

 

- 46 – String length

Functia strlen() returneaza lungimea unui sir de caractere

<?php
$string_length = strlen('How many characthers does this have?');
echo $string_length;
?>
Se afiseaza: 35

 

Vom folosi si o variabila care sa stocheze un sir de caractere si vom afisa dimensiunea acelui sir

 <?php
$string = 'Alex';
$string_length = strlen($string);
echo $string_length;
?>
Se afiseaza: 4

Daca ne propunem sa parcurgem un sir de caractere? Trebuie sa stim cand ne oprim si pentru asta folosim ca punct de oprire lungimea sirului pe o aflam cu strlen.

 <?php
$string = 'Alex';
$string_length = strlen($string);
for($x=1; $x<= $string_length; $x++)
 {
 echo $x . ' ';
 }
?>
Se afiseaza:
1 2 3 4

Momentan doar am afisat pentru fiecare caracter din sir doar pozitia lui dar mai tarziu vom putea procesa in acelasi mod fiecare caracter din sir afisandu-l sau folosind-ul in diverse scopuri.

 – 47 – Upper and lower case conversion

Conversii in litere mici sau litere mari

strtolower pentru litere mici

strtoupper pentru litere mari

<?php
$string = 'I Could Be Any Case';

$string_lower = strtolower($string);
$string_upper = strtoupper($string);

echo $string_lower;
echo string_upper;
?>
Se afiseaza
i could be any case I COULD BE ANY CASE

 

De ce sunt utile aceste functii in PHP?

Sa exemplificam prin crearea unui formular de login. Trebuie sa verificam daca o persoana care isi da numele exista in baza de date

 <form action="index.php" method="GET">
Name: <input type="text" name="user_name"> <br><br>
<input type="submit" value = "Submit">
</form>

Exista posibilitatea ca cineva sa isi scrie cu numele cu litere mici desi in baza de date numele e scris cu majuscula. Solutia e sa transformam toate literele sirului preluat din formular in litere mici iar orice ar tasta userul in formular (toate literele mari, toate mici, la inceput cu majuscula sau in orice alt mod) noi putem verifica corect daca si-a introdus numele lui.

Din formular informatiile se pot prelua cu ajutorul vectorilor $_GET sau $_POST, de aici si metoda method=”GET”.

Pentru a prelua informatiile dintr-un anumit camp trebuie sa ne folosim de numele lui: daca dorim sa extragem informatia din <input type=”text” name=”user_name”> vom folosi $_GET[‘user_name’].

Astfel:

 <?php
if( isset($_GET['user_name']) && !empty($_GET['user_name']) )
{
echo $user_name = $_GET['user_name'];
}
 ?>

De ce se foloseste method = “GET”?

Ca sa putem urmari in bara de adrese valorile transmise. Prin method=”POST” nu s-ar putea vedea in bara de adrese.

isset($_GET[‘user_name’]) returneaza true daca exista variabila $_GET[‘user_name’], adica daca o fost trimisa informatia din formular.

empty($_GET[‘user_name’]) returneaza true daca $_GET[‘user_name’] este vida adica nu a fost scris nimic in formular inainte de a se da submit. De aceea noi verificam daca ! empty($_GET[‘user_name’]) este true adica daca s-a scris ceva in formular.

Daca ambele conditii sunt adevarate

if( isset($_GET[‘user_name’]) && !empty($_GET[‘user_name’]) )

atunci se stocheaza in variabila $user_name informatia din $_GET[‘name’]

In momentul in care s-a tastat Alex in campul Nume si apoi s-a apasat submit, in bara de adrese a browser-ului a fost afisat index.php?user_name=Alex

Acum dorim sa verificam daca numele introdus este egal cu ‘alex’

 if($user_name=='alex')
{
echo 'You are the best.';
}

Totusi daca numele a fost tasta cu majuscula (Alex) comparatia nu mai este adevarata.

Vom crea o noua variabila $user_name_lc (lc de la lower case) care sa primeasca strtolower($username). Nu vom schimba valoarea din $user_name pentru ca e posibil sa avem nevoie la un moment dat de valoarea introdusa de user.

$user_name_lc = strtolower($user_name);

Script-ul complet va arata astfel:

 <form action="index.php" method="GET">
Name: <input type="text" name="user_name"> <br><br>
<input type="submit" value = "Submit">
</form>

<?php
if( isset($_GET['user_name']) && !empty($_GET['user_name']) )
{
$user_name = $_GET['user_name'];
$user_name_lc = strtolower($user_name);

if(user_name_lc=='alex')
{
echo 'You are the best, '.  $user_name;
}
}

?>

 

Daca se va introduce in campul Name valoarea aLeX se va afisa

You are the best, aLeX

pentru ca am folosit valoarea introdusa initial de user si stocat in $user_name dar in comparatii am folost variabila $user_name_lc care contine numele user-ului cu litere mici.

 

 – 48 – String position strpos();

Gasirea pozitiei unui sir in alt sir

strpos() primeste 3 argumente

– primul este sirul in care se cauta

– al doilea este sirul cheie de cautat

– al treilea, optional, este offset-ul, de unde sa inceapa cautarea in string

 

Sa cautam intr-un sir subsirul ‘is’

<?php
$find = 'is';
$find_length = strlen($find);

$string = 'This is a string, and it is an example';
echo strpos($string, $find);
 ?>
 Se afiseaza 2

pentru ca ‘is’ este pe pozitia 2(pornind de la 0) in sirul ‘This is a string…’

 

Daca dorim sa gasim si alta aparitia a sirului ‘is’ atunci vom specifica un offset de 3 (punctul de pornire fata de pozitia 0)

 echo strpos($string,$find,3);
se va afisa 5

pentru ca ‘is’ se gaseste si de la pozitia 5 in sirul ‘This is a string…’

 

Dar sa gasim o metoda astfel incat sa putem afisa toate aparitiile lui $find in sirul $string

Pentru aceasta vom folosi o bucla while in care vom cauta in sirul $string cat timp cautarea nu da rezultat de eroare.

Pentru aceasta vom folosi dupa fiecare cautare si parametrul offset care va primi ca valoare ultima pozitie gasita + lungimea sirului de gasit $find, $find_length. Astfel dupa fiecare aflare a pozitiei lui $find se sare peste acea pozitie folosind offset-ul si tot asa pana cand nu se mai gaseste nici o aparitie a lui $find.

 

<?php

$offset=0;
$find = 'is';
$find_length = strlen($find);
$string = 'This is a string, and it is an example.';

while($string_position = strpos($string, $find, $offset))
{
echo '<b>'.$find .'</b>'. ' found at '. $string_position. '<br>';
$offset = $string_position + $find_length;
}

?>
Se afiseaza toate aparitiile lui 'is'
 is found at 2 is found at 5 is found at 25

 

La ce putem folosi acest script?

In loc de un text oarecare asa cum este $find=’is’ se poate folosi preluarea dintr-un formular

$find=$_GET[‘user_name’]

si se poate cauta numele introdus intr-un alt sir de caractere.

 

- 50 – Inlocuirea unui sir dintr-un subsir.

Daca dorim sa inlocuim un sir in alt sir dar dorim ca acest lucru sa nu se intample decat intr-o anumita portiune din sirul in care se cauta, atunci putem limita cautarea si inlocuirea doar la un subsir.

Pentru asta folosim functia substr_replace()

<?php

$string = 'This part don't search. This part search';
$string_new =  substr_replace($string, 'alex', 29, 4);
echo $string_new;
?>

Va afisa:
This part don't search. This alex search

 

pentru ca in sirul $string, 4 caractere de la pozitia 29 au fost inlocuite cu sirul ‘alex’.

 

- 51 – Inlocuirea unui sir

str_replace();

Poate primi 3 parametri

– primul este sirul care se cauta si se inlocuieste

– al doilea este sirul cu care se inlocuieste

– al treilea este sirul in care se cauta

 

str_replace(looking for, to replace, string);


<?php
$string = 'This is string, and is an example.';
$new_string = str_replace('is', ' ', $string);
echo $new_string;
?>
 Afiseaza:
Th string, and an example.

unde au fost inlocuite toate aparitiile lui ‘is’ cu ‘ ‘.

 

Putem merge mai departe si sa inlocuim si alte sectiuni din sirul $new_string:

 <?php
$string = 'This is string, and is an example.';
$new_string = str_replace('is', ' ', $string);
$new_string = str_replace('string', ' ', $new_string);
echo $new_string;
?>
 Se afiseaza
Th , and an example.

unde, pe rand, din sirul original au fost inlocuite sirurile ‘is’ si ‘string’ cu ‘ ‘.

Dar aceasta nu este o modalitate corecta de a inlocui in mod repetat siruri in alte siruri.

 

Functia str_replace poate accepta un vector cu elemente care trebuie inlocuite.

 <?php
$find = array('is', 'string',' example');
$string = 'This is a string, and is an example.';

$new_string = str_replace($find, ' ', $string);

echo $new_string;
?>

Va afisa:
Th a , and an .

pentru ca au fost inlocuite toate aparitiile lui ‘is’, ‘string’ si ‘example’ cu sirul ‘ ‘.

Dar putem realiza simultan inlocuiri ale fiecarui element din vectorul $find cu cate un sir diferit.

Se poate crea in mod similar un alt vector cu elemente care vor inlocui pe cele din vectorul $find;

<?php
$find = array('is', 'string','example');
$replace = array('IS','STRING',' ');
$string = 'This is a string, and is an example.';

$new_string = str_replace($find, $replace, $string);
echo $new_string;
?>
Va afisa
ThIS IS a STRING, and IS an .

pentru ca fiecare element din $find a fost inlocuit cu elementul corespunzator din $replace.

Aceasta metoda este utila atunci cand dorim sa evitam aparitia unor cuvinte intr-un text, cand vrem sa ne asiguram ca nu sunt scrise expresii neplacute intr-un formular care trimite informatii intr-o zona publica a site-ului. Se poate in acest mod construi un filtru pentru “cuvinte rele”.

 

- 52 – Cenzurarea cuvintelor

Vom prelua un text din formular si apoi folosind str_replace vom inlocui anumite cuvinte pe care nu le dorim in textul nostru.

 

<?php
$find = array('alex','billy','dale');
$replace = array('a**x','b***y','d**e');

 if( isset($_POST["user_input"])  && !empty($_POST["user_input"]) )
{
//echo "works";
$user_input=$_POST["user_input"];

// $user_input_new = str_replace($find, $replace, $user_input); nu functioneaza pentru litere mari
$user_input_lc = strtolower($user_input);
$user_input_new = str_replace($find, $replace, $user_input_lc);

echo $user_input_new;
 }
?>

<form action="index.php" method= "POST">
<textarea name="user_input" rows="7" cols="30">
<?php
echo $user_input;
?>
 </textarea><br><br>
<input type="submit" value="submit">
</form>

 

Sa analizam codul de mai sus:

Din formular este trimisa informatia cu ajutorul vectorului POST in variabila $_POST[‘user_input’]. Verificam apoi daca nu preluam o variabila vida cu ajutorul functiilor isset si empty

Salvam in variabila $user_input informatia preluata din formular.

Adaugam o variabila care va stoca textul preluat din formular dar transformat in litere mici user_input_lc.

Aplicam asupra ei functia str_replace. In acest mod inlocuirea cuvintelor, indiferent cu ce tip de litere sunt scrise, se va face doar pe textul scris cu litere mici si prin urmare va functiona intotdeauna.

Pentru textul introdus in formular:

I went out with Danny, Billy, Dale and Alex

Va afisa:

i went out with danny, b***y, d**e and a**x

Totusi, acum, suntem intr-o alta situatie care ar putea sa nu fie convenabila. De aceasta data textul afisat este transformat cu totul in litere mici si nu ne dorim ca toate cuvintele pe care le-am scris sa fie transformate. De aceea vom folosi din start functia str_ireplace care inlocuieste cuvintele indiferent daca sunt cu litere mari sau mici.  Prin urmare vom rescrie codul facand modificarea str_replace cu str_ireplace.

 

<?php
$find = array('alex','billy','dale');
$replace = array('a**x','b***y','d**e');

 if( isset($_POST["user_input"])  && !empty($_POST["user_input"]) )
{
//echo "works";
$user_input=$_POST["user_input"];
$user_input_new = str_ireplace($find, $replace, $user_input); 
echo $user_input_new;
}
?>

<form action="index.php" method= "POST">
<textarea name="user_input" rows="7" cols="30">
<?php
echo $user_input;
?>
 </textarea><br><br>
<input type="submit" value="submit">
</form>

 

Pentru textul introdus in formular:

I went out with Danny, Billy, Dale and Alex

 

Va afisa:

I went out with Danny, b***y, d**e and a**x

 

53. Crearea unei aplicatii de tip Find and Replace

Scopul aplicatiei este de a descoperi modul in care se lucreaza cu functia substr_replace. Gasirea si inlocuirea unui sir de caractere se poate face foarte simplu folosind functia str_replace insa exista si situatii in care se cere utilizarea lui substr_replace. Vom incerca sa folosim substr_replace pentru gasirea si inlocuirea unui sir de caractere indiferent de cate ori apare in text.

Functia substr_replace este de forma

substr_replace( sirul_in_care_se_inlocuieste, cuvantul_care_inlocuieste, pozitia_de_la_care_se_inlocuieste, numarul_de_caractere_inlocuite)

astfel daca avem sirul “The big cat sat on the mat” si dorim sa inlocuim cat cu monkey atunci vom folosi functia substr_replace astfel:

<?php
echo substr_replace("The big cat sat on the mat","monkey",8,3);
?>

pentru ca am gasit pe pozitia 8(pornind de la 0) textul “cat” si acesta are lungimea de 3 caractere.

 

<?php
$offset = 0;

if( isset($_POST['text'])  && isset($_POST['searchfor'])  && isset($_POST['replacewith'] ) )
{
$text = $_POST['text'];
$search = $_POST['searchfor'];
$replace = $_POST['replacewith'];
$search_length = strlen($search);

if(!empty($text) && !empty($search) && !empty($replace))
{
//echo "ok";

  while($strpos = strpos($text, $search, $offset))
   {
    $offset = $strpos + $search_length;
    $text=substr_replace($text,$replace,$strpos,$search_length);
  }

}
else
{
echo "please fill in all the fields";
}

}
?>

<form action="noname1.php" method="POST">
<textarea name="text" rows="6" cols="30">

<?php
echo $text;
?>


</textarea> <br><br>
Search for:
<input type="text" name="searchfor"><br><br>
Replace with:
<input type="text" name="replacewith"> <br><br>
<input type="submit" value="Find and replace">
</form>

 

Sa analizam codul:

Mai intai verificam daca in formular au fost inserate informatii valide. Astfel verificam pentru fiecare camp elementul corespunzator din vectorul POST. Apoi colectam fiecare text in cate o variabila $text, $search si $replace.

Deasemeni, tot pentru validare, le verificam daca nu cumva sunt vide, adica aplicam functia empty(). Daca toate cele 3 variabile exista si sunt nevide atunci trecem la prelucrarea propriu-zisa.

Ne asiguram ca avem variabila $offset initializata cu 0. Aceasta ne va folosi in momentul in care am gasit o aparitie a lui $search in $text si vrem sa pornim cautarea de dupa acea aparitie.

Astfel pe masura ce gasim cate o aparitie a lui $search actualizam valoarea lui $offset prin adaugarea la valoarea lui $strpos lungimea lui $search. In acest fel urmatoarea cautare va porni dupa textul $search gasit in $text.

Dupa fiecare gasire a lui $search se realizeaza inlocuirea acestuia in $text cu $replace.

Se procedeaza astfel in bucla while pana cand nu se mai gasesc aparitii a lui $search in $text, adica atunci cand strpos($text,$search, $offset) returneaza false.

In final se afiseaza $text, fie in interiorul campului textarea, fie separat.