Просмотр напред в регулярните изрази на PHP
Понякога трябва да решим задача от този тип: намери
низ 'aaa' и го замени с '!',
но само ако след 'aaa' има
'x', а самият 'x' при това
да не се заменя. Ако се опитаме да решим задачата
'директно', нищо няма да стане:
<?php
preg_replace('#aaax#', '!', 'aaax'); // ще върне '!', а трябва '!x'
?>
За решаването на задачата е необходим начин да кажем,
че 'x' не трябва да се заменя. Това се
прави със специални скоби (?= ),
които просто проверяват, но не вземат със себе си.
Тези скоби се наричат позитивен просмотр
напред. Позитивен - защото 'x'
(в нашия случай) трябва да има - само тогава
ще се извърши замяна.
Нека приложим тези скоби за решаването на нашата задача:
<?php
preg_replace('#aaa(?=x)#', '!', 'aaax'); // ще върне '!x'
?>
Има и негативен просмотр напред
- (?! ) - той, обратно, казва, че
нещо трябва да липсва. В следващия пример
замяната ще се извърши, само ако след 'aaa'
няма 'x':
<?php
preg_replace('#aaa(?!x)#', '!', 'aaab'); // ще върне '!b'
?>
Даден е низ, съдържащ имена на функции:
<?php
$str = 'func1() func2() func3()';
?>
Получете масив с имената на функциите от низа.
Даден е низ с таг:
<?php
$str = '<a href="" class="eee" id="zzz">';
?>
Получете масив с имената на атрибутите на този таг.