Php 用于替换html代码中css类的正则表达式
我正在为php中的preg_replace寻找一个正则表达式,它用缩小的类名替换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(( \
$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;