Эта тема на forum.dklab.ru


Г.О.: PCRE: поиск шаблона в определенной позиции
Здравствуйте!

Делаю некоторое подобие токинезатора.
Имеется исходный код. В цикле проверяется наличие в его начале токена определенного типа (обычно с помощью регулярок).
Если он там присутствует - он вырезается из начала кода и отправляется на дальнейшую обработку.

Простейший пример (раскрашиваем пустоты и слова в различный цвет):

function getToken($pattern, &$code)
{
if (!preg_match($pattern, $code, $matches)) {
return false;
}
$code = subStr($code, strLen($matches[0]));
return $matches[0];
}

$code = 'Исходный код';

$result = '';
while (strLen($code)> 0) {
$space = getToken('~^\s+~', $code);
$word = getToken('~^\S+~', $code);
$result .= '<span style="background-color:red">'.$space.'</span><span style="background-color:green">'.$word.'</span>';
}

print '<pre>'.$result.'</pre>';


На маленьких текстах всё работает хорошо, на больших начинает значительно тормозить. Понятно — каждый раз кромсаем исходную строку, изменяя размер.

В preg_match есть аргумент $offset, который позволяет искать совпадения с шаблоном начиная с некоторого смещения.
То есть по идее можно не уменьшать каждый раз исходную строку, а считать "вырезанные" символы и искать начиная с этого числа.
Но вот незадача:
Note: Использование параметра offset не эквивалентно замене сопоставляемой строки выражением substr($subject, $offset) при вызове функции preg_match_all(), поскольку шаблон pattern может содержать такие условия как ^, $ или (?<=x).
А у меня как раз "^", так как искать нужно в начале строки.

Можно, конечно, убрать "^", установить $flags в PREG_OFFSET_CAPTURE и смотреть по смещению, где найдено совпадение - в начале или нет. Но тогда регулярка будет просматривать всю отнюдь не маленькую строку.


Можно ли что-нибудь провернуть с $offset или еще чем нибудь, чтобы не приходилось постоянно резать строку?
Г.О.:
Всё оказалось элементарно, нужно просто внимательнее читать документацию.
Модификатор A(PCRE_ANCHORED):

Если данный модификатор используется, соответствие шаблону будет достигаться только в том случае, если он соответствует началу строки, в которой производится поиск.



Вопрос решен, тему можно закрыть.
Maus:
Тема закрыта.

Эта тема на forum.dklab.ru