Замена PHP или MySQL для тегов <img> в записях содержимого с поддержкой HTML

0

Теги Ive в следующем формате распространяются по всем элементам контента, включенным в HTML:

<img alt="" src="{assets_2100:{filedir_12}HappyDog.jpg}" style="height:400px; width:100px">

Мне нужно обновить все это в следующем формате либо с помощью функции PHP перед отображением на frontend, либо просто обновить MySQL раз и навсегда:

<img alt="" src="/uploads/HappyDog.jpg" data-assetid="2100" data-filedir="12" data-filename="HappyDog.jpg" style="height:400px; width:100px"> 

Путь "/uploads/directory" применим для всех изображений!

Эти теги переносились при переносе содержимого из EE

Отредактировано: Хорошо, до сих пор я пробовал следующее как первый шаг, чтобы удалить {filedir_X} из адреса:

    $parse_encoded = true;
    $pattern = ($parse_encoded)
        ? '/(?:{|&#123;)filedir_(\d+)(?:}|&#125;)/'
        : '/{filedir_(\d+)}/';
    if (preg_match_all($pattern, $htmlcontent, $matches, PREG_SET_ORDER))
    {
        foreach ($matches as $match){
            $htmlcontent = str_replace($match[0], '', $htmlcontent);
        }
    }

Затем изменили это, чтобы удалить "{asset", но в итоге "}" в атрибуте "src"!

  • 0
    какой это формат?
  • 0
    @MarkoPaju Этот формат был применим к Expression Engine, но на данный момент мне просто нужно зарезервировать все атрибуты для последующих манипуляций с JS, прежде чем удалять их из атрибута «src»!
Показать ещё 3 комментария
Теги:
preg-match
replace

1 ответ

1
Лучший ответ

Поиск совпадений с preg_match_all для обработки результатов и использования str_replace - пустая трата времени. PHP имеет две функции для замены регулярных выражений: preg_replace и preg_replace_callback (соответственно для простых и сложных замен).

if ( $parseEncoded )
    $htmlContent = strtr($htmlContent, ['&#123;' => '{', '&#125;' => '}']);

$pattern = '~src=\K(["\']?){assets_(\d+):{filedir_(\d+)}([^}]+)}\1~i';
$replacement = '"/uploads/$4" data-assetid="$2" data-filedir="$3" data-filename="$4"';

$htmlContent = preg_replace($pattern, $replacement, $htmlContent);

Обратите внимание, что я изменил имена переменных: вам нужно выбирать между camelCase, snake_case и строчными буквами.

  • 1
    Коротко, элегантно и красиво. Работает как шарм. Спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню