【问题标题】:I have HTML comments being wrapped in Li and P tags :(我有 HTML 注释被包裹在 Li 和 P 标签中:(
【发布时间】:2009-08-10 13:01:35
【问题描述】:

我的内容首先是htmlentities,然后是stripslashes,然后是nl2br

这意味着最后的水印结束为:

<li><p><!-- watermark --></p></li>

不是很有用。我有下面的代码来尝试剥离 html cmets 并停止它的显示,但它不是很好!

$methodfinal = str_replace('<li><p><!--', '<!--', $method);
$methodfinal2 = str_replace('--></p></li>', '-->', $methodfinal);
echo $methodfinal2;

有人有什么想法吗?

【问题讨论】:

  • 你能说明你的预期输出是什么吗?
  • 他想从输出中消除空的 [li][p],我猜
  • so $methodfinal2 会回显
  • content

  • content

  • 的地方是的

标签: php html regex preg-replace


【解决方案1】:

编辑: 在 Zed 和你的 cmets 之后,我做了一些测试,这是你应该使用的:

$final = preg_replace('/<li><p>[\s]*?&lt\;!--(.*?)--&gt\;<\/p><\/li>/m', "<!--$1-->", $z);

这里是 RE 的细分:

<li><p>

这很明显

[\s]*?

因为&lt;li&gt; 和注释之间有几个空格和换行符,但我们希望换行符最少,所以我们使用非贪婪 *? (它也适用于 *)

&lt\;

需要转义;

!--(.*?)--

我们再次使用 *?所以我们只会匹配这一行(否则,如果你再次有相同的行,它会从第一行匹配到最后一行

&gt\;<\/p><\/li>

同上

/m'

所以 php 会将换行符视为空格(我对此不确定,但它似乎有效)

【讨论】:

  • 所以现在我们只能希望评论中没有 > 符号 ;)
  • Daniel,它不起作用,因为您的 html 源代码不正确。评论有 <!-- 和 -->在侧面而不是 .
  • @Daniel,Zed 是对的,请不要使用我写的内容。 @Zed你是对的,我应该使用非贪婪的?*但我现在没有任何测试方法。对不起。
  • so $final = preg_replace("/
  • (&lt!--[^>]*-->)/", "$1", $原始);不行吗?

  • 有人敢猜吗? preg_replace 两个标签应该不会太难吧?
  • 【解决方案2】:

    这样的?

    $final = preg_replace("/<li><p>(<!--.*-->)<\/p><\/li>/", "$1", $original);
    

    【讨论】:

      【解决方案3】:

      @Zed:

      让我们更加关心:

      $final = preg_replace("/<li><p>(<!--.*?-->)<\/p><\/li>/", "$1", $original);
      # use .*? every time over .* unless you specificly want what it does
      # .*? matches as less as it can
      # .* matches as much as it can
      

      更好:

      $final = preg_replace("/<li><p>(<!--[^\-\>]+-->)<\/p><\/li>/", "$1", $original);
      # [^\-\>]+ will look for any character that is not - or > 
      # so will perform faster
      

      只是试图提倡更好的正则表达式实践。希望这会有所帮助。

      【讨论】:

      • 最后的获胜声明是:preg_replace('/
      • [\s]*?&lt\;!--(.*?)--&gt\;/m', "", $original);可以用同样的方式改进吗?

    • 使用 [\s]*? 没有意义。您应该使用 \s*。如果您有一组字符,例如空格或数字,则可以使用 [\s\d] 或 [\s0-9]。要使其匹配多个字符,请使用 +(1 个或多个)或 *(零个或多个)或 ? (一个或一个)在它之后。然后考虑使用?匹配零个或多个,(匹配尽可能少)。你能看懂\s吗?不像.*那么明智?所以使用 \s+ (至少一个空格,可能更多)或 \s* (零个或多个空格)或 \s? (零个或一个空格)在这里。 preg_replace('/
    • \s*\;/m', "

    • 猜你喜欢
      相关资源
      最近更新 更多
      热门标签