Ðåãóëÿðíûå âûðàæåíèÿ PHP.



Ðåãóëÿðíûå âûðàæåíèÿ. 2002-07-04
Àâòîð: Àíäðåé Ãîëîâèí Ñòðàíèöû: [1]

Äî ïîñëåäíåãî âðåìåíè äëÿ ìåíÿ âåëè÷àéùåé çàãàäêîé è êèòàéñêîé ãðàìîòîé ïðåäñòàâëÿëèñü çàãàäî÷íûå "ðåãóëÿðíûå âûðàæåíèÿ" (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 


Àâòîð: Àíäðåé Ãîëîâèí




Ïðè ïåðåïå÷àòêå èíôîðìàöèè äåëàéòå, ïîæàëóéñòà, ññûëêó íà íàø ñàéò (ëèáî ïîäåëèòüñÿ âêîíòàêòå, ãóãë+ èëè äåëèòåñü â îäíîêëàññíèêàõ ñòàòü¸é). Ñïàñèáî!

Èñòî÷íèê: www.wr-script.ru©, 2004-2026ã.

Äåëèòåñü ñ äðóçüÿìè â ñîöñåòÿõ. Àêòèâíûå êîììåíòàòîðû ïîëó÷àþò ñâåæèå ñêðèïòû è áåñïëàòíûå äîðàáîòêè îò WR-Script.ru!

Âåðíóòüñÿ ê ñòàòüÿì ïîìîùè WEB-ìàñòåðó

WR-Счётчик