我正在为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}
任何人都可以帮助我使用正则表达式替换所有模板的出现吗?
答案 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" />
$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;