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

时间:2014-07-03 07:38:19

标签: php html regex replace smarty

我正在为php中的preg_replace寻找一个正则表达式,它用缩小的类名替换html文件中的类名。我是在css缩小过程中这样做的。 我有一个关联数组,其中类名作为键,替换为值。 即:

$myReplacements = array('fonts' => 'f', 'label' => 'l', 'tiny' => 't')

这些替换只能在完全匹配时完成,而不能在像&font-small-size'这样的类上进行。我的正则表达式是:

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

使用replaceregex:

"$2$3f$5$6"

-

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

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

这种替换应该在类似于' ui-icon-thumbs-up'并且应该用“ui-thumbs-up”替换。我的正则表达式是:

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

使用replaceregex:

"$1ui-$2"

我要替换此类名的HTML文件包含以下内容:

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

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

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

上面的模板代码替换为:

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

任何人都可以帮助我使用正则表达式替换所有模板的出现吗?

2 个答案:

答案 0 :(得分:0)

您不想使用preg_replace,您想使用preg_replace_callback()。 将class属性拉出标记,在空格上拆分,处理结果数组的每个元素,然后将其粘贴回来。 像这样......

$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
);

答案 1 :(得分:0)

希望这会有所帮助......

我的用例:

将附加(css)类附加到html标记的class属性

演示: https://regex101.com/r/YZ1Nre/2

正则表达式:

/(?<opening_tag><input)(?<attributes_before_class>.*)(?<class_attribute_start>class=\')(?<class_value>.*?)(?<class_attribute_end>\')(?<attributes_after_class>.*)(?<closing_tag>\/>)/

换人:

${opening_tag}${attributes_before_class}${class_attribute_start}${class_value} uk-width-1-1 ${class_attribute_end}${attributes_after_class}${closing_tag}

测试字符串:

  <input name='input_4' id='input_2_4' type='text' value='' class='large'  tabindex='1'   aria-required="true" aria-invalid="true" />

结果:

 <input name='input_4' id='input_2_4' type='text' value='' class='large uk-width-1-1'  tabindex='1'   aria-required="true" aria-invalid="true" />


PHP代码:

$re = '/(?<opening_tag><input)(?<attributes_before_class>.*)(?<class_attribute_start>class=\')(?<class_value>.*?)(?<class_attribute_end>\')(?<attributes_after_class>.*)(?<closing_tag>\/>)/';
$str = 'Your test string here';
$new_css_class = 'uk-width-1-1';

$subst = '${opening_tag}${attributes_before_class}${class_attribute_start}${class_value} '.$new_css_class.' ${class_attribute_end}${attributes_after_class}${closing_tag}';

// if the named group replacing doesnt work, just use the indices as references
//$subst = '${1}${2}${3}${4} uk-width-1-1 ${5}${6}${7}';

$result = preg_replace($re, $subst, $str);

echo "The result of the substitution is ".$result;