如何根据w3c使用str_replace或其他一些php函数使img标签有效?

时间:2013-12-24 17:01:23

标签: php html regex w3c-validation

让我们说我们有一个图片标签,但不是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;”还是我们可以通过其他方式实现这一点?

3 个答案:

答案 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(?<!/)>
替换:/>

使用preg_replace() -

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。解决困境有两种选择

  • 持久的bug-squasher 将在发生这种情况的每一行上进行更新,我会使用preg_replace来执行此类任务。验证插入的所有新内容
  • 运行且易于实施的垃圾解决方案将再次使用preg_replace来改变输出。

正如您所看到的,显而易见的选择是使用常规表达式。最好的选择是停止将html放入数据库中并/或更新所有元组以符合新规则

我相信用户sln给了你一个非常好的 regExp