Jóska iszik a kulacsából.
Iszik Jóska a kulacsából.
Iszik a kulacsából Jóska.
Emese iszik a kulacsából.
Lajos iszik a kulacsából.
Persze lehet ez bármilyen szöveg, bármilyen karakterekkel. Lehet esetleg egy weblap forrása amelyből szeretnénk kinyeri a weboldal tartalmát a html elemek nélkül:
**példa2**
Weboldal címe
Weboldal
tartalma
==== Lehetséges feladatok ====
Több feladatunk lehet. Például
* keressük meg azokat a sorokat, amelyekben szerepel az "Emese" szó.
* válogassuk ki azokat a sorokat, amelyekben szerepel a "Jóska" szó.
* olyan sorokat szeretnék, amelyben a Jóska szó a sor elején szerepel
* töröljük az összes html elemet a szövegből.
A megtalált sorokkal aztán több dolgot is tehetünk.
* vizsgálhatjuk, egyáltalán megtalálható-e (Match)
* lecseréljük másra, törölhetjük (replace)
* feldarabolhatjuk az illeszkedés mentén (split)
===== Alapvető szintaxis =====
==== Illeszkedés sor elején vagy végén ====
=== Elmélet ===
A fentiekben az egyik lehetséges feladat volt, hogy keressük meg azokat a sorokat, amelyek a "Jóska" szóval kezdődnek. Vagyis sor eleji illeszkedést kell vizsgálnunk. Ez a következő karakterrel tehetjük meg:
^
Az illeszkedés vizsgálatához készítenünk kell egy mintát, azaz egy szabályos kifejezést:
^Jóska
A szabályos kifejezés azt jelenti, amit fentebb szeretünk volna. Akkor illeszkedik, ha a sor Jóskával kezdődik.
Sor végi illeszkedés a dollár karakterrel valósítható meg:
$
Ha olyan sorokat szeretnék, amelyeknél a "Jóska" a sor végén van, akkor $ karaktert használunk a szabályos kifejezésben:
Jóska$
Ha csak olyan sorokat szeretnék, amelyben a "Jóska szó egyedül szerepel, akkor jelzem a szabályos kifejezésben, hogy illeszkedjen a sor elejére és a végére is:
^Jóska$
=== Egyezés keresés a gyakorlatban ===
Keressük azokat a sorokat, amelyek elején van Jóska:
Ha van ilyen sor, akkor 1-es, azaz igaz értéket kapunk. Ha nincs ilyen akkor 0-át kapunk.
A mintaillesztés esetén a minta kezdetét és végét "/" karakterrel jelezzük.
Erre azért van szükség, mert később a minta mellett, módosítókat is fogunk
használni.
Most olyan sorokat keresünk, amelyekben benne van a Jóska (bárhol):
Most olyan sorokat keresünk, amelyekben benne van a "jóska" kisbetűvel:
Ekkor nem találunk egyezést, vagyis nullát kell kapnunk.
Most olyan sorokat keresünk, amelyekben benne van a Jóska bárhol, de az lehet kis és nagybetűs:
Vegyük észre az beírt "i" betűt. Az "i" a case-insensitive szavakból származik, ami azt jelenti, nincs kis és nagybetűérzékenység.
=== Csere gyakorlat ===
\n\n\n";
print "\n\n";
$str = <<< EOS
Jóska iszik a kulacsból
Iszik Jóska a kulacsból
Iszik a kulacsból Jóska
EOS;
print preg_replace("/Jóska/", "Pista", $str);
print "";
?>
Most beállítottam a generált html oldal karakterkódolását is, a megjelenítendő ékezetes karakterek miatt.
Vegyük észre az új preg_replace() függvényt.
Most töröljük a
\n\n\n";
print "\n\n";
$str = <<< EOS
Jóska iszik a kulacsból
Iszik Jóska a kulacsból
Iszik a kulacsból Jóska
EOS;
print preg_replace("/
/", "", $str);
print "";
?>
=== Darabolás gyakorlat ===
";
print "Telepules: $tomb[1]";
?>
Szóközökkel elválasztott szavak:
";
print "Telepules: $tomb[1]";
?>
Ezt megoldhatjuk, egyszerűen egy szóköz írásával.
Előfordulhat, nemcsak szóköz, hanem bármilyen más whitespace karakterre szeretnénk illeszkedést. Ekkor használjuk az "s" helyettesítőt. Minden helyettesítő karaktert egy visszaperjel "\" vezet be:
";
print "Telepules: $tomb[1]";
?>
Ekkor illeszkedni fog szóközre és tabulátorra is. Azonban még mindig csak egyetlen szóközre vagy tabulátorra illeszkedik.
==== Karakterek, illetve minta előfordulása ====
Használt szimbólumok: * + ?
==== Unicode karakter illeszkedése ====
\x{FFFF}
\X
\p{L}
===== Escape szekvenciák =====
| \d | egy decimális szám |
| \D | egy karakter, amely nem decimális szám |
| \h | egy horizontális elválasztó (whitespace) karakter (PHP 5.2.4-től) |
| \H | egy karaktere, amely nem horizontális elválasztó (whitespace) karakter (PHP 5.2.4-től) |
| \s | egy whitespace karakter |
| \S | egy karakter, amely nem elválasztó (whitespace) karakter |
| \v | egy vertikális elválasztó (whitespace) karakterr (PHP 5.2.4-től) |
| \V | egy karakter, amely nem vertikális elválasztó (whitespace) karakter (PHP 5.2.4-től) |
| \w | egy betű vagy szám vagy aláhúzás karakter (word) |
| \W | egy karakter, amely nem betű vagy szám vagy aláhúzás karakter (non-word) |
| \b | Egy szóhatár (word boundary), egy hely a szó (word \w) és a nem szó (non-word) karakterek között |
| \B | Nem egy szóhatár |
===== Karakterosztályok =====
^ Osztály ^ Jelentés ^
| alnum | Betűk és számok |
| alpha | Betűk |
| ascii | A karakterkódja 0 és 127 közzé esik |
| blank | szóköz vagy tabulátor |
| cntrl | Kontrollkarakterek |
| digit | Decimális számok (megegyezik a következővel: \d) |
| graph | nyomtatható karakterek, kivéve a szóköz |
| lower | kesbetűk |
| print | nyomtatható karakterek és a szóköz |
| punct | nyomtatható karakterek a betűk és a számok kivételével |
| space | white space (nem egészen egyezik meg a következővel:\s) |
| upper | nagybetűk |
| word | "szó" karakterek (megyegyezik a következővel: \w) |
| xdigit | hexadecimális számok |
===== Módosítók =====
^ Módosító ^ Állandó ^
| i | PCRE_CASELESS |
| m | PCRE_MULTILINE |
| s | PCRE_DOTALL |
| x | PCRE_EXTENDED |
| U | PCRE_UNGREEDY |
| X | PCRE_EXTRA |
| J | PCRE_INFO_JCHANGED |
A módosítókat a minta után írjuk. Például ne legyen kis és nagybetűérzékeny:
/^valami_minta$/i
===== Példa a szóhatárra vágásból =====
Az szeretném, ha 12 karakterenként cserélje le 0 -értékre a szöveget.
";
$str = "szerettem volna elvagni";
print preg_replace("/^(.{12,})\b/U", "0", $str);
?>
A \b a szóhatár jelöli.
===== Linkek =====
* http://weblogtoolscollection.com/regex/regex.php
* http://vbence.web.elte.hu/regex_leiras.html
* http://www.pagecolumn.com/tool/pregtest.htm
* http://www.spaweditor.com/scripts/regex/index.php