让我们说我们有一个图片标签,但不是w3c有效,因为最后缺少“/>” :
<img src="myfile.png" alt="MyiMage" title="MyImage" border="0" >
然后我们如何用str_replace par示例或其他php函数替换它,以便我们可以使这个图像有效:
<img src="myfile.png" alt="MyiMage" title="MyImage" border="0" />
再次看来,我们需要一些正则表达式(?)以便以某种方式表达“/&gt;”还是我们可以通过其他方式实现这一点?
答案 0 :(得分:2)
假设我们有这个字符串:
$my_img = '<img src="myfile.png" alt="MyiMage" title="MyImage" border="0" >';
要使其成为自动结束标记,您确实可以使用str_replace
:
$my_img = str_replace('>', '/>', $my_img);
这应该可以解决问题:
$str = '<img src="myfile.png" alt="MyiMage" title="MyImage" border="0" >';
$str_2 = preg_replace('/(<img .+)( >)/', '${1} />', $str);
我们选择$str
并将其放入preg_replace
我们寻找仅匹配img
代码的模式,并将&gt; 更改为 /&GT;
答案 1 :(得分:1)
找到:<img\s[^>]*\K(?<!/)>
替换:/>
PHP旧测试用例
$xhtml = '<img src="myfile.png" alt="MyiMage" title="MyImage" border="0" >';
$str = preg_replace( '~<img\s[^>]*\K(?<!/)>~', "/>", $xhtml );
print $xhtml. "\n";
print $str;
编辑 - 由于请求downvote,我将修改正则表达式 这是为了那些认为html / xhtml / xml应该用正则表达式解析的纯粹主义者 到OP - 原始正则表达式更容易理解(可能更好!)。
PHP新测试用例
$xhtml = '<img src="myfile.png" alt="MyiMage" title="MyImage" border="0" >';
$str = preg_replace( '~(?s)<img(?=\s|>)(?>(?:".*?"|\'.*?\'|[^>]*?)+\K>)(?<!/>)~', "/>", $xhtml );
print $xhtml. "\n";
print $str;
输出&gt;&gt;
<img src="myfile.png" alt="MyiMage" title="MyImage" border="0" >
<img src="myfile.png" alt="MyiMage" title="MyImage" border="0" />
新的正则表达式解释
# '~(?s)<img(?=\s|>)(?>(?:".*?"|\'.*?\'|[^>]*?)+\K>)(?<!/>)~'
(?s) # Dot-All modifier
<img # 'img' tag
(?= \s | > ) # Assert followed by a whitespace or closing tag
(?> # Atomic magic -
(?: # Do this many times
" .*? " # Anything in double quotes
| ' .*? ' # Anything in single quotes
| [^>]*? # Least amount of non '>' chars as possible
)+
\K # \K, don't include up to here in the match output
> # Finally, the closing '>', the only character in match output
)
(?<! /> ) # Assert that tag was not closed
答案 2 :(得分:0)
据我所知,你的数据库中有html
。解决困境有两种选择
preg_replace
来执行此类任务。验证插入的所有新内容preg_replace
来改变输出。正如您所看到的,显而易见的选择是使用常规表达式。最好的选择是停止将html放入数据库中并/或更新所有元组以符合新规则
我相信用户sln
给了你一个非常好的 regExp