Вызов функции PREG_REPLACE

С безопасностью, а также устаревшей функцией; Что будет самым простым и безопасным способом вызова функции при поиске и замене?

Есть четыре модуля поиска и замены, которые можно вставить в контент [album][/album], [img][/img], [youtube][/youtube], or [vimeo][/vimeo],

С помощью функции, которую я до сих пор собирал, изображения, YouTube и Vimeo были простыми. Альбом не так уж и много. Я хотел бы вызвать функцию на основе параметров, которые передаются.

Я пытался изменить эту функцию в preg_replace_callback и это просто издевается над всем. Есть ли альтернативы?

function FormatModules($text) {
    $find = array(
        '~\[album\](.+?)\[/album\]~s',
        '~\[img width=(.*?) height=(.*?) alt=(.*?)\](https?://.*?\.(?:jpg|jpeg|gif|png))\[/img\]~s',
        '~\[youtube\](.+?)\[/youtube\]~s',
        '~\[vimeo\](.+?)\[/vimeo\]~s'
    );
    $replace = array(
        'GenerateAlbum($1)', // call a PHP function
        '<img src="$4" width="$1" height="$2" alt="$3" />',
        '<iframe src="http://www.youtube.com/embed/$1"></iframe>',
        '<iframe src="https://player.vimeo.com/video/$1"></iframe>'
    );
    return preg_replace($find, $replace, $text);
}

0 ответов

Если вы хотите вызвать функцию для более чем одной замены или хотите настроить свой сценарий для будущих модификаций, чтобы можно было вызывать функции для параметра замены, вы можете использовать preg_replace_callback_array ().

В противном случае, я бы сказал, сделать preg_replace_callback() с участием первых элементов $find а также $replace затем запустить вызов preg_replace() на остальные элементы.

Код: ( Демо)

function GenerateAlbum($match) {
    return "<div class=\"album\>Do whatever: " . strtoupper($match[1]) . "</div>";
}

function FormatModules($text) {
    $text = preg_replace_callback('~\[album\](.+?)\[/album\]~s', "GenerateAlbum", $text);
    $find = array(
        '~\[img width=(.*?) height=(.*?) alt=(.*?)\](https?://.*?\.(?:jpg|jpeg|gif|png))\[/img\]~s',
        '~\[youtube\](.+?)\[/youtube\]~s',
        '~\[vimeo\](.+?)\[/vimeo\]~s'
    );
    $replace = array(
        '<img src="$4" width="$1" height="$2" alt="$3" />',
        '<iframe src="http://www.youtube.com/embed/$1"></iframe>',
        '<iframe src="https://player.vimeo.com/video/$1"></iframe>'
    );
    return preg_replace($find, $replace, $text);
}

echo FormatModules("[vimeo]test1[/vimeo]\n\n[album]test2[/album]\n\njust text\n\n[img width=50 height=100 alt='sumpin good']http://www.example.com/image.gif[/img]\n\n[youtube]test3[/youtube]");

Выход:

<iframe src="https://player.vimeo.com/video/test1"></iframe>

<div class="album\>Do whatever: TEST2</div>

just text

<img src="http://www.example.com/image.gif" width="50" height="100" alt="'sumpin good'" />

<iframe src="http://www.youtube.com/embed/test3"></iframe>
Другие вопросы по тегам