这是我的代码:
$pattern = '!<(img\s[^>]*?)>!is';
$html = '<img height="401" width="830" style="width:200px;height:150px" class="media-element file-default" typeof="Image" src="http://localhost.com/sites/default/files/sample_chart.png" alt="">';
$html = preg_replace_callback($pattern, 'custom_callback', $html);
在此代码中,如何保留img标签的样式属性
样式属性出现在任何带有img标记的地方。我想保留它。
答案 0 :(得分:2)
怎么样?
正则表达式1 :preg_replace("/(<img\s?)(.*)(style=\".*?\")(.*)(>)/i", "$1$2$3", $imageTag)
或
正则表达式2 :preg_replace("/<img.*(style=\".*?\").*>/i", "<img $1>", $imageTag)
?
注意:我没有基准测试,但使用单个捕获组(第二个正则表达式)可能更有效。
在您的示例中:<img height="401" width="830" style="width:200px;height:150px" class="media-element file-default" typeof="Image" src="http://localhost.com/sites/default/files/sample_chart.png" alt="">
两个正则表达式都返回:<img style="width:200px;height:150px">
<img
height="401" width="830"
style="width:200px;height:150px"
(第二个正则表达式中的唯一组)class="media-element file-default" typeof="Image" src="http://localhost.com/sites/default/files/sample_chart.png" alt=""
>
解释正则表达式1 :
(<img\s?)
:括号用于捕获组。匹配文字文本<img
和可选(问号表示0或1次)空格\s
。.*
:匹配任何字符(点)0或更多时间(星号)。(style=\".*?\")
:括号用于捕获组。匹配文字文本style=\"
。您需要转义引用,因为您将在PHP中的字符串中使用正则表达式。匹配任何字符(点)0或更多时间(星)尽可能少的时间(量词后面的问号)。由于星号(*)后跟一个问号(?),它会在到达第一个引用\"
后立即停止捕捉字符。.*
:匹配任何字符(点)0或更多时间(星号)。(>)
:结束时捕获组 替换:$1$2$3
替换捕获组1,2和3的文本并忽略其余部分
解释正则表达式2 :
<img.*
:匹配文字文本<img
和可选(问号表示0或1次)空格\s
,后跟任何字符(星号)0或多次(明星)。 2. (style=\".*?\")
:括号用于捕获组。匹配文字文本style=\"
。您需要转义引用,因为您将在PHP中的字符串中使用正则表达式。匹配任何字符(点)0或更多时间(星)尽可能少的时间(量词后面的问号)。由于星号(*)后跟一个问号(?),它会在到达第一个引号\"
后立即停止捕捉字符。
.*>
:尽可能多地匹配任何字符(点)(星号),直到到达标记的末尾(&gt;)。 替换:<img $1>
将文字替换为文字<img
,后跟空格,即单个捕获和标记的结束符号。
使用进行测试:https://www.functions-online.com/preg_replace.html
成功