download.bg
 Вход Списание  Новини  Програми  Статии  Форум  Чат   Абонамент  Топ95   Архив 

Работа със регулярни изрази във PHP

Автор
Съобщение
anonymous
Сря, 19.03.08, 22:11
Някой може ли нещо да каже по тази тема, със няколко примера.
phrozencrew
Чет, 20.03.08, 08:51

RE: Работа със регулярни изрази във PHP

” Някой може ли нещо да каже по тази тема, със няколко примера. „
Armen, бях писал един урок за извличане на валутните курсове от сайта на БНБ посредством PHP функцията preg. Можеш да погледнеш урока тук:
Валутни курсове - извличане само на необходимото с preg и PHP
Ето ти и един скрипт, който извлича текста с прогнозата за времето от сайта на БТВ:
<?php
$string1 = file_get_contents('http://btv.bg/weather/');
preg_match('/<div align="left">(.*?)</div>/is', $string1, $m);
echo $m[1];
?>

От php.net можеш да си потърсиш какво означава и какво прави всякака буквичка в този регулярен израз. По-късно през деня може да коментираме още за регулярните изрази, защото аз съм голям фен на това Perl богатство в PHP.

phrozencrew
Чет, 20.03.08, 20:01
Хм, не бях забелязал, че БТВ са си обновили сайта. В този случйн по-горният код би изглеждал така:
<?php
$string1 = file_get_contents('http://btv.bg/weather/');
preg_match('/<\/div>(\s)+<p>(.*?)<\/p>\s+<\/div>/is', $string1, $m);
echo $m[2];
?>

insecteater
Пет, 21.03.08, 09:47
Регулярните изрази наистина са нещо мнооого хубаво и мощно.
Не знам дали ще намериш информация за тях на руски, затова ще ти напиша на български
По принцип регулярният израз представлява шаблон за намиране на съвпадения. Принципът е долу горе същият както при маските когато търсиш файлове (от сорта на *.doc) , но много по мощни

Например:
. (точката) замества всеки символ, било то буква, препинателен знак, празно пространство - всичко
израз a.m ще пасне на всяка от думите: army, atm, mycam

символа ^ означава начало на низа, а символа $ означава край на низа
израз ^mys ще пасне на mysister и mystic, но няма да пасне на rasmys

Има така нар. quantifiers
* (звездичка) означава нула или повече символа като предходния, пред който е поставена
например no*b ще пасне на nob, noooooob и също така ще пасне И на nb
+ (плюсче) означава един или повече символа като предходния, пред който е поставен
? (въпроситлен) означава нула или един символа като предходния пред който е поставен

Едно много чсто използвано съчетание е израза .* в съчетание с нещо определено
В примера който е дал phrozencrew ако забелязваш,, той знае точно текста, който обгражда търсената позиция и намира всичко между div таговете (колкото и дълго да е то)

В израза всичко заградено в скоби, се "запомня" и запазва за последваща употреба и точно това е начина, чрез който се "извлича" намереният текст в рамките на регулярния израз
Например израза am (.*) years приложен към текста
Hi, I am 20 years old

ще даде съвпадение и освен това текста "20" ще се запази в една номерирана променлива или елемент от масив според езика и начина на извличане който използваш

Има обаче едно неприятно нещо: например искаш да извлечеш числото за download.bg от този текст:
download.bg: 134, hit.bg: 128, abv.bg: 120,

и правиш следният израз: download.bg (.*), с надеждата между скобите да попадне само интересуващото те число, понеже след него ма запетайка. Проблемът е, че съчетанеието точка звездичка - .* е "алчно" и ще ти върне всичко до ПОСЛЕДНАТА срещната запетая, т.е ще се извлече "134, hit.bg: 128, abv.bg: 120", а не само "134", каквото е първоначалното ни намерение. Ето защо се използва съчетанието .*?, което вече не е толкова алчно, а спира при първото срещнато съвпадение. Ама така си е - quantifier-ите са си алчни.

Обикновено регулярният израз се загражда с /, но не е задължително, важното е да има вттори символ означаващ края на границата, която е била посочена с начален символ
например /Hi.*/ е същото като #Hi.*#

Може да се вкарват и разни модификатори, след края на границата - едни буквички, като всяка е с точно определено значение, например дали израза да важи за целият текст, независимо че има нови редове или пък $ значи освен край на низа също и край на ред, или пък дали малките и главните букви да имат значение при претърсването и т.н.

Има още много много възможности, които правят регулярните изрази едно много, ама много мощно средство за претърсване и извличане на информация, това тук са само някои елементарни насоки

редактиран от insecteater на 21.03.08 09:48
редактиран от insecteater на 21.03.08 09:49
phrozencrew
Пет, 21.03.08, 20:27

RE: Работа със регулярни изрази във PHP

” Регулярните изрази наистина са нещо мнооого хубаво и мощно.
Не знам дали ще намериш информация за тях на руски, затова ще ти напиша на български
Че как няма да намери :), той е умно момче, а и братята руси са необятни от към информация. Ето какво намерих аз на руски, страхотно е:
1. http://www.pcre.ru/ - цял сайт посветен на регулярните изрази, има много фетски примерчета.
2. http://www.opennet.ru/base/dev/php_regexp.txt.html - много добра статия на Sergey Kolesnichenko за регулярните изрази.

Ето и допълнителни линкове от чичо.

Коментар

за нас | за разработчици | за реклама | станете автори | in english  © 1998-2024   Experta Ltd.