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

Php 用于替换html代码中css类的正则表达式,php,html,regex,replace,smarty,Php,Html,Regex,Replace,Smarty,我正在为php中的preg_replace寻找一个正则表达式,它用缩小的类名替换html文件中的类名。我在css缩小过程中完成了这项工作。 我得到了一个关联数组,其中类名作为键,替换项作为值。 即: $myReplacements=array('font'=>f', “标签”=>“l”, 'tiny'=>'t') 这些替换只能在完全匹配的情况下进行,而不能在“fonts small size”这样的类上进行。我的正则表达式是: /"((.*[^"]?)?(\} | |\}))?fonts(( \

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

$myReplacements=array('font'=>f',
“标签”=>“l”,
'tiny'=>'t')

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

/"((.*[^"]?)?(\} | |\}))?fonts(( \{| |\{)(.*[^"])?)?"/
/"(.*)ui-icon-(.*)"/
使用replaceregex:

"$2$3f$5$6"
"$1ui-$2"
--

我得到了第二个带有替换的关联数组,这也应该只对从它开始的类执行:

$forcedReplacements = array('ui-icon-' => 'ui-')
这种替换应该在诸如“ui图标竖起”之类的类上完成,并且应该替换为“ui竖起”。我的正则表达式是:

/"((.*[^"]?)?(\} | |\}))?fonts(( \{| |\{)(.*[^"])?)?"/
/"(.*)ui-icon-(.*)"/
使用replaceregex:

"$2$3f$5$6"
"$1ui-$2"
我要在其中替换此类名的HTML文件包含以下内容:

{if !$isSmallFontCheckDisabled}
    <span class="{if $smallFontFromCharacters}fonts tiny{/if}{if $hasStandardLabel} fonts label{/if}">
{/if}
{if!$isSmallFontCheckDisabled}
{/if}
这是我的一个模板文件的一个简单小片段。如您所见,我使用smarty作为模板引擎。因此,在正则表达式中还必须考虑smarty语法

在大多数情况下,替换工作相当好。如果两次获得包含同一类的class属性的模板文件(如果获得if/else smarty块,则可能会发生这种情况),则会出现问题。然后,只替换其中一个

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

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

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

如果您不想使用preg\u replace,请使用preg\u replace\u 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
);
$line=preg\u replace\u回调(
“/(希望这有帮助

我的用例: 将附加(css)类附加到html标记的class属性

演示:

正则表达式: 测试字符串:

结果:


PHP代码:
$re='/(?)/';
$str='您的测试字符串在此';
$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};
//如果命名组替换不起作用,只需使用索引作为引用
//$subst='${1}${2}${3}${4}uk-width-1-1${5}${6}${7}';
$result=preg_replace($re,$subst,$str);
echo“替换结果为”。$result;

你能提供一个缩小的文件或至少一个片段吗?这些片段是我发布的模板片段。第一个是未缩小的片段。第二个是缩小的相同片段(字体=>f,缩小=>t,标签=>l)那么,在这种情况下,您是否应该发布正则表达式失败的片段,而不是表达式正常工作的片段:)您是否尝试添加
g
(全局)修饰符,意思是-在第一次匹配时不返回。因此,尝试将表达式修改为
/regular expression/g
,g修饰符不适用于preg_replace,也不需要(),正如我所写的,如果class属性中没有两次类,则始终成功
$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;