Страница 1 из 1

[php/pcre] повторение в ограничителях. туплю.

Добавлено: 2012-07-01 4:08:24
FreeBSP
выделяю пыхом аккорды из текста подбора, пример файла прикрепляю
туплю..
надо преобразовать строку вида

Код: Выделить всё

TEXT<WORD  WORD ...   WORD>TEXT
в

Код: Выделить всё

<pre>TEXT<span>WORD</span>  <span>WORD</span> <span>...</span>   <span>WORD</span>TEXT</pre>
Здесь :
строка не содержит символов перевода строк
WORD - один или более идущих подряд непробельных символов, /(\S+)/
TEXT - ноль или более печатных символов, пробельные, буквенно-цифровые, спецсимволы
между < и WORD может быть ноль или более пробельных символов
в угловых скобках может быть одно или более WORD. между собой WORD разделены одним или более пробельными символами

вся строка предварительно отформатирована, и выводится в <pre> тегах, поэтому сохранение всех пробельных символов на своих местах обязательно.
угловая скобка считается метасимволом и в форматировании не участвует

в лоб напрашивается решение раскусить строку на три и разбирать их отдельно но это как то некрасиво :cz2: хочется все сразу одной регуляркой сделать. кто нить видит красивое решение?

Re: [php/pcre] повторение в ограничителях. туплю.

Добавлено: 2012-07-01 11:00:08
FreeBSP
вроде решил через pcre_replace_callback(). но неужто нельзя одной регуляркой такое сделать?
для php >=5.3.0

Код: Выделить всё

freebsp# php -f pcre.php
one < two three> four <five six > seven
 => one  <span style="color: #333cc;">two</span> <span style="color: #333cc;">three</span> four <span style="color: #333cc;">five</span> <span style="color: #333cc;">six</span>  seven
freebsp# cat pcre.php
<?php
$src = "one < two three> four <five six > seven\n";
$dst = preg_replace_callback(
        "/<(.*?)>/",
        function($str) {
                //var_dump($str);
                return preg_replace("/(\S+)/","<span style=\"color: #333cc;\">\\1</span>", $str[1]);

        },
        $src
);
echo $src . " => " . $dst;

freebsp#