Запустите Callback для всего, что не в квадратных скобках (BBCodes) - PullRequest
0 голосов
/ 11 апреля 2011

Просто сшил небольшой обратный вызов, чтобы выделить все мои BBCodes.Взял мои возрасты, потому что регулярные выражения все еще являются для меня огромной болью.

function highlight($str) {
  return '<b>'.$str[0].'</b>';
}

$str = '[b]Hello, World![/b] in either the color [blue]test[/blue] or [red]test[/red]';
$highlight = preg_replace_callback('|[[\/\!]*?[^\[\]]*?]|si', 'highlight', $str);
echo $highlight;

Но теперь я действительно хотел бы сделать обратное :) Каким будет регулярное выражение для выделения всего остального, кроме BBCodes?

1 Ответ

0 голосов
/ 11 апреля 2011

Это не лучшее решение, но оно будет работать.

$re = '/
    (.*?)                           # text before bBB...eBB
        (\[(\w+?)\].*?\[\s*\/\3\])  # bBB...eBB
    |
    (.*?$)                          # text after last bBB..eBB
    /xui';

$string = "beginOfS [b]Hello, World![/b] in either the color [blue]test lorem [yel]ipsum[/yel] dolorem [/blue] or [red]test[/red] endOfS";

echo  preg_replace($re, '<b>\1\4</b>\2', $string);

// $nMatches = preg_match_all($re, $string, $aMatches);

Возврат:

<b>beginOfS </b>[b]Hello, World![/b]<b> in either the color </b>[blue]test lorem [yel]ipsum[/yel] dolorem [/blue]<b> or </b>[red]test[/red]<b> endOfS</b>
...