Перехід від ereg до preg

ЗавданняНеобхідно відмовитися від застосування функцій ereg на користь функцій preg.

РішенняСпочатку додамо в шаблон обмежувачі:

Для нечутливого до регістру порівняння за допомогою функції eregi() вкажіть модифікатор /i:

Якщо цілі числа виступають замість рядків як шаблони або заміщаючі значення, перетворіть число в шістнадцяткову форму і вкажіть його за допомогою escape-послідовності:

$hex = dechex($number); preg_match("/\x$hex/", 'string');

ОбговоренняЄ кілька істотних відмінностей між ereg і preg. По-перше, у разі застосування функцій preg шаблон є не просто рядком pattern, а виглядає як /pattern/,1 оскільки в ньому повинні бути вказані роздільники, як у мові Perl.

ereg('pattern', 'string'); перетворюється на: preg_match('/pattern/', 'string');

При виборі розділювачів шаблону не можна розміщувати символи-розділювачі всередині самого шаблону регулярного виразу, інакше ви занадто рано закриєте шаблон.

Якщо обійти цю перешкоду не вдається, будь-яке входження символів-розділювачів у шаблон треба екранувати за допомогою символу зворотної косої риси. Замість того, щоб робити це вручну, викличте функцію addcslashes().

Наприклад, якщо як роздільник виступає символ /:

$ereg_pattern = '.+'; $preg_pattern = addcslashes($ereg_pattern, '/');

Значення змінної $preg_pattern тепер дорівнює.+.

Серед функцій preg немає аналогічного набору функцій, які не чутливі до регістру. Усі вони можуть містити нечутливий до регістру модифікатор. Щоб перейти до іншого набору функцій, замініть:

eregi('pattern','string'); на: preg_match('/pattern/i', 'string');

Зміна здійснюється додаванням символу i після завершального роздільника. Нарешті, ще одна, остання, не зовсім явна відмінність. Якщо у функції ereg_replace() як шаблон або заміщувальне значення виступає число (а не рядок), то передбачається, що цим ви вказуєте ASCII код символу. Тому, а також тому, що 9 – це ASCII-представлення символу табуляції (тобто \t), наступний код вставить символ табуляції на початок кожного рядка:

$ tab = 9; $replaced = ereg_replace('^', $tab, $string);

А в такий спосіб буде виконано перетворення символів перекладу рядка:

$converted = ereg_replace(10, 12, $text);

Щоб запобігти такій поведінці функції, у функціях ereg запис повинен бути таким:

З іншого боку, функція preg_replace() розглядає число 9 як 9, а не як заступник символу табуляції.

Щоб конвертувати коди символів для використання у функції preg_replace(), перетворіть їх у шістнадцяткову форму та додайте до них префікс \x.

Наприклад, 9 стає \x9 або \x09, а 12 перетворюється на \x0c. В якості альтернативи можна використовувати \t, \r та \n для позначення табуляції, повернення каретки та перекладу рядка відповідно.