php - 用于替换 html 代码中的 css 类的正则表达式

标签 php html regex replace smarty

我正在寻找 php 中 preg_replace 的正则表达式,它用缩小的类名替换 html 文件中的类名。我在 css-minifying 过程中执行此操作。 我得到了一个关联数组,其中类名作为键,替换项作为值。 即:

$myReplacements = array('fonts' => 'f', '标签' => 'l', '小' => 't')

这些替换应该只在完全匹配的情况下进行,而不是在像“fonts-small-size”这样的类上进行。我的正则表达式是:

/"((.*[^"]?)?(\} | |\}))?fonts(( \{| |\{)(.*[^"])?)?"/

用替换正则表达式:

"$2$3f$5$6"

--

我得到了第二个带有替换的关联数组,对于仅以它开头的类也应该这样做:

$forcedReplacements = array('ui-icon-' => 'ui-')

这种替换应该在像“ui-icon-thumbs-up”这样的类上完成,并且应该替换为“ui-thumbs-up”。我的正则表达式是:

/"(.*)ui-icon-(.*)"/

用替换正则表达式:

"$1ui-$2"

我要替换此类名称的 HTML 文件具有以下内容:

{if !$isSmallFontCheckDisabled}
    <span class="{if $smallFontFromCharacters}fonts tiny{/if}{if $hasStandardLabel} fonts label{/if}">
{/if}

这是我的一个模板文件的一个小片段。如您所见,我使用 smarty 作为模板引擎。因此,在我的正则表达式中也必须考虑聪明的语法。

在大多数情况下,替代品工作得很好。如果我的模板文件的类属性包含相同的类两次,我就会遇到问题(如果我有 if/else-smarty-block 可能会发生这种情况)。然后两者中只有一个被替换。

上面的模板片段被替换为:

{if !$isSmallFontCheckDisabled}
    <span class="{if $smallFontFromCharacters}fonts t{/if}{if $hasStandardLabel} f l{/if}">
{/if}

谁能帮我用我的正则表达式来替换所有出现的模板?

最佳答案

你不想使用 preg_replace,你想使用 preg_replace_callback()。 将类属性从标签中拉出,按空格拆分,处理结果数组的每个元素,然后将其粘贴回一起。 像这样的……

$line = preg_replace_callback(
    '/(<[^<] class=\")([^"]*)(\")/',
    function ($matches) {
        $classes = explode(' ', $matches[2])
            /*
                Do your class name replacements here
            */
        return $matches[1].(implode(' ', $classes)).$matches[3];
    },
    $line
);

关于php - 用于替换 html 代码中的 css 类的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24547747/

相关文章:

php - 如何使用 PHP/MYSQLI 更新数据库记录并与传递的变量保持在同一页面上

php - 导入标题与数据库字段不同的 Excel 文档 - Laravel 5.2

php - 在 mysql 列中添加数字

php - MySQL 查询在 PHP 中静默失败

ios - 每次在 iOs 中重新加载循环的 HTML5 视频

java - 如何从 Android/Java 中的字符串中获取多个子字符串?

html - 如何将内容包裹在div中?

html - 将鼠标悬停在 li 上时更改颜色

javascript - 替换为 RegEx 和 JavaScript

java - 将先前捕获的组与正则表达式匹配(反向引用?)