Äî ïîñëåäíåãî âðåìåíè äëÿ ìåíÿ âåëè÷àéùåé çàãàäêîé è êèòàéñêîé
ãðàìîòîé ïðåäñòàâëÿëèñü çàãàäî÷íûå "ðåãóëÿðíûå âûðàæåíèÿ" (regular
experssions). ×òî æå ýòî òàêîå?
Ðåãóëÿðíûå âûðàæåíèÿ - ñàìûé ìîùíûé èíñòðóìåíò ðàáîòû ñî
ñòðîêàìè, êîòîðûé ñìîãëè âûäóìàòü ñîâðåìåííûå ïðîãðàììèñòû. Ñ èõ
ïîìîùüþ ìîæíî ïðîâîäèòü àíàëèç ñòðîê, íà ñîäåðæàíèå
ïîñëåäîâàòåëüíîñòåé ñèìâîëîâ, ïðîèçâîäèòü çàìåíó íà îñíîâå ýòîé
âûáîðêè, ðàçáèâàòü ñòðîêè íà ìàññèâû è ìíîãîå äðóãîå.
Ïðîùå âñåãî ðàçîáðàòüñÿ ñ èõ óñòðîéñòâîì íà ïðèìåðàõ. Äëÿ ýòîãî
ìîæíî èñïîëüçîâàòü ñïåöèàëüíûå ôóíêöèè PHP äëÿ ðàáîòû ñ ðåãóëÿðíûìè
âûðàæåíèÿìè (RE):
ereg(); ereg_replace(); eregi(); ereg_replacei(); split();
Ôóíêöèè ñ ñóôôèêñîì i ïðåäñòàâëÿþò èç ñåáÿ àíàëîãè ôóíêöèé áåç
ýòîãî ñóôôèêñà, íå ÷óâñòâòèòåëüíûå ê ðåãèñòðó îïåðàíäîâ. Ðàññìîòðèì,
äëÿ íà÷àëà, ôóíêöèþ split().
Âûãëÿäèò îíà òàê: array split(string pattern, string string, int
[limit]);. Îñíîâíûì åå ïàðàìåòðîì ÿâëÿåòñÿ pattern (øàáëîí). Â íåì
ñîäåðæèòñÿ RE, äëÿ ïîèñêà â ñòðîêå string. Ýòà ôóíêöèÿ ñòðîèò ìàññèâ
íà îñíîâå àíàëèçà ñòðîêè, ãäå ðàçäåëèòåëåì ÿâëÿåòñÿ ñòðîêà, çàäàííàÿ
øàáëîíîì.
Ïðèíöèï ðàáîòû ýòîé ôóíêöèè íà ïîíÿòíîì ÿçûêå âûãëÿäèò íå òàê óæ
è ñòðàøíî: Ðàçáèòü ñòðîêó íà êîìïîíåíòû (ïîäñòðîêè), ñîîòâåòñòâóþùèé
ïðàâèëàì, îïèñàíûì â ïàðàìåòðå pattern. Ïðàâèëî ìîæåò âûãëÿäåòü,
íàïðèìåð, òàê: Ñëîâà ðàçäåëåíû çàïÿòîé è ëþáûì êîëè÷åñòâîì ïðîáåëîâ,
ïðè÷åì ïðîáåëîâ ìîæåò íå áûòü. Ýòî âïîëíå "æèçíåííîå" ïðàâèëî. Íà
åãî îñíîâå ìîæíî ïîñòðîèòü ìàññèâ êëþ÷åâûõ ñëîâ, ñîäåðæàùèõñÿ â
ñòðîêå è ðàçäåëåííûõ çàïÿòûìè, à ïîñëå çàïÿòîé ìîæåò èäòè ëþáîå
êîëè÷åñòâî ïðîáåëîâ (íî íå îáÿçàòåëüíî). Òåïåðü ðàññìîòðèì êàê
çàïèñàòü ýòî ïðàâèëî â íîòàöèè RE.
, *. Êàæäûé ñèìâîë â øàáëîíå âàæåí. Îáðàòèòå âíèìàíèå íà
ïðîáåë ìåæäó çàïÿòîé è çâåçäî÷êîé - ýòî íåîáõîäèìûé ýëåìåíò øàáëîíà.
Ïåðâûé ñèìâîë îçíà÷àåò îáÿçàòåëüíóþ çàïÿòóþ ïîñëå ñëîâà, à
êîìáèíàöèÿ " *" (ïîìíèòå, ÷òî ïðîáåë - ýëåìåíò øàáëîíà) - ëþáîå
êîëè÷åñòâî ïðîáåëîâ èëè èõ îòñóòñòâèå. Çâåçäî÷êà ÿâëÿåòñÿ
ìîäèôèêàòîðîì è ãîâîðèò, ÷òî èäóùèé ïåðåä íåé ñèìâîë ìîæåò
âñòðå÷àòüñÿ 0 èëè áîëüøå ðàç.
Ðàññìîòðèì, êàê âñå ýòî ðåàëèçîâàòü íà PHP ñ ïîìîùüþ RE:
$str = "test, one, to, sree";
$regs = split(", *",$str);
for ($i = 0; $i <= count($regs)-1; $i++) {
echo $i," : ",$regs[$i];
}
È ðåçóëüòàò ðàáîòû äàííîãî êîäà:
0 : test 1 : one 2 : to 3 : sree
Ïðè÷åì, ñòðîêà $str ìîæåò âûãëÿäåòü òàê: "test, one, to, sree",
èëè òàê: "test,one,to,sree", èëè òàê:
"test,one, to, sree". Ðåçóëüòàò áóäåò
îäèíàêîâûì.
Ïåðåéäåì ê áîëåå ñëîæíîìó ïðèìåðó èç æèçíè. Ïîïûòàåìñÿ îïðåäåëèòü
âåðñèþ áðàóçåðà èç ñòðîêè $HTTP_USER-AGENT, äëÿ Internet Explorer.
Òèïè÷íàÿ ñòðîêà âûãëÿäèò òàê:
Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)
Ñíà÷àëà ïîïûòàåìñÿ îïðåäåëèòü ïðàâèëî âûáîðêè íîìåðà âåðñèè
îáû÷íûì ÿçûêîì. Ïåðåä íîìåðîì âåðñèè îáÿçàòåëüíî èäåò êîìáèíàöèÿ
ñèìâîëîâ "MSIE" è ïðîáåë, çàêàí÷èâàåòñÿ íîìåð âåðñèè òî÷êîé ñ
çàïÿòîé. Ïðîñòî? Òåïåðü çàïèøåì ýòî â òåðìèíàõ RE. MSIE ([^;]+). Êàê
âèäèòå, çäåñü èñïîëüçóþòñÿ ñêîáêè ðàçëè÷íîé êîíôèãóðàöèè. ×òî îíè
îçíà÷àþò? Êðóãëûå ñêîáêè îïðåäåëÿþò òîò ýëåìåíò, êîòîðûé ìû èùåì â
ñòðîêå (â íàøåì ñëó÷àå - øàáëîí íîìåðà âåðñèè âåðñèè). Êâàäðàòíûå -
îïðåäåëÿþò íàáîð ñèìâîëîâ, êàæäûé èç êîòîðûõ ìîæåò ñîñòàâëÿòü ÷àñòü
íîìåðà âåðñèè. ^ - ïðåäñòàâëÿåò ñîáîé îòðèöàíèå. Ò.å. êîíñòðóêöèÿ
[^;], â ïåðåâîäå íà ðóññêèé îçíà÷àåò "ëþáîé ñèìâîë, êðîìå òî÷êè ñ
çàïÿòîé". + ïîñëå êâàäðàòíûõ ñêîáîê ãîâîðèò, ÷òî òàêèõ ñèìâîëîâ
(îòëè÷íûõ îò ;) äîëæíî áûòü ìèíèìóì 1 (èëè áîëüøå). Êðóãëûå ñêîáêè
îáîçíà÷àþò ãðàíèöû èñêîìîé ïîäñòðîêè. Ñîîòâåòñòâóþùàÿ øàáëîíó â
êðóãëûõ ñêîáêàõ ïîäñòðîêà ñîõðàíÿåòñÿ â ñïåöèàëüíîé ïåðåìåííîé.
Òàêèì îáðàçîì RE MSIE ([^;]+) ïåðåâîäèòñÿ íà ðóññêèé ÿçûê, êàê "âñå
ñèìâîëû, îòëè÷íûå îò òî÷êè ñ çàïÿòîé, ñëåäóþùèå çà íàáîðîì ñèìâîëîâ
MSIE è ïðîáåëîì".
Íî íàì íåîáõîäèìî ïîëó÷èòü íîìåð âåðñèè. Äëÿ ýòîãî ñóùåñòâóåò
ôóíêöèÿ ereg() (èëè åå ðåãèñòðîíåçàâèñèìûé àíàëîã eregi()). Âûãëÿäèò
îíà òàê: int ereg(string pattern, string string, array [regs]);. Â
ïàðàìåòðå pattern ïåðåäàåòñÿ øàáëîí, â string - ñòðîêà äëÿ ðàçáîðà,
à â ïàðàìåòðå regs ïåðåäàåòñÿ ìàññèâ íàéäåíûõ ïîäñòðîê,
ñîîòâåòñòâóþùèõ øàáëîíó â êðóãëûõ ñêîáêàõ. Ïåðâûé (ñ èíäåêñîì 0)
ýëåìåíò ìàññèâà ïðåäñòàâëÿåò ñîáîé ïîäñòðîêó, ñîîòâåòñâóþùóþ âñåìó
øàáëîíó pattern. Åñëè ïîäñòðîêà, ñîîòâåòñòâóþùàÿ øàáëîíó pattern íå
íàéäåíà, òî âîçâðàùàåòñÿ çíà÷åíèå false èíà÷å, êîëè÷åñòâî íàéäåííûõ
ïîäñòðîê.
 äàííîì ñëó÷àå âûçîâ ýòîé ôóíêöèè áóäåò âûãëÿäåòü òàê:
ereg("MSIE ([^;]+)",$HTTP_USER_AGENT,$regs); echo "$HTTP_USER_AGENT : $HTTP_USER_AGENT
"; echo "VERSION : $regs[1]";
Âîò ðåçóëüòàò ðàáîòû ýòîãî êîäà:
$HTTP_USER_AGENT : Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0) VERSION : 6.0