【问题标题】:How to make an img tag valid according to w3c with str_replace or some other php function? [closed]如何根据 w3c 使用 str_replace 或其他一些 php 函数使 img 标签有效? [关闭]
【发布时间】:2013-12-24 17:01:23
【问题描述】:

假设我们有一个图像标签,但不是 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" />

似乎在这里我们需要一些正则表达式正确(?)以便以某种方式处理“/>”,或者我们也可以通过其他方式来实现它?

【问题讨论】:

  • 图片标签是如何存储的?您是通过 PHP 生成它,还是从数据库或文本文件中提取它,并且您想在输出时对其进行修改?
  • 嗨,我只是在 Mysql 之前执行了一个 SELECT,然后将其作为变量回显。那么?
  • 它在 HTML 中有效,只是在 XHTML 中无效。 XHTML 的好处非常少见,只有开发人员体验过,而大多数人都没有体验过。使用 HTML 而不是 XHTML。
  • 所以你选择了部分,或者选择返回你输出的完整text
  • Quentin,我想让它在 XHTML 中有效,而不是在 HTML 中,这导致我的网站在 XHTML 中。那么如何..?

标签: php html regex w3c-validation


【解决方案1】:

假设我们有这个字符串:

$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 标记的模式并将> 更改为/> .

【讨论】:

  • 如果我们的图像有一个标题=">" 在这种情况下它再次正确工作怎么办?
  • 如果我们有一个包含 img 标签的 href,那么您的答案是不正确的,那么一个 href 标签的结尾有问题,变得像 ../>而不是
  • 这就是为什么您应该提供更详细的问题。部分问题=不完整/不正确的答案。用preg_replace 很容易解决这个问题,但是我不能完全理解需要修复什么,请详细说明。
  • 好吧,我的英语不好.. :( 我知道这一点,但我正在尽我所能来定义我的问题.. 嗯,如果你能更好地理解我的意思,如果你知道,请尝试帮助当其他标签(例如 par example 存在)时,我会导致您给我的答案不起作用
【解决方案2】:

查找:&lt;img\s[^&gt;]*\K(?&lt;!/)&gt;
替换:/&gt;

PHP 旧测试用例使用 preg_replace() -

 $xhtml = '<img src="myfile.png" alt="MyiMage" title="MyImage" border="0" >';
 $str = preg_replace( '~<img\s[^>]*\K(?<!/)>~', "/>", $xhtml );

 print $xhtml. "\n";
 print $str;

编辑 - 由于投反对票,我将修改正则表达式。
这是为那些认为应该用正则表达式解析 html/xhtml/xml 的纯粹主义者准备的。
致 OP - 原始的正则表达式更容易理解(而且可能更好!)。 p>

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;

输出>>

 <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

【讨论】:

  • sln.. 不熟悉正则表达式请你解释一下如何应用你刚刚写的内容?
  • @anny32 - 添加信息。
  • sln 非常感谢!
  • 中心撑不住了,来不及了。
  • @MadaraUchiha 小马!他来了!全没了! 迷路了!
【解决方案3】:

据我所知,您的数据库中有html。有 2 个选项可以解决您的困境

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

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

相信用户sln给了你一个不错的regExp

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 2021-10-05
    • 2013-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多