【问题标题】:Regexp aren't working with paragraph tags正则表达式不适用于段落标签
【发布时间】:2012-06-24 15:50:20
【问题描述】:

我正在尝试修复一些 HTML,它运行良好。但有一件事是给我带来麻烦;特别是打开和关闭<p></p> 标签。 我需要解决两种情况: a) 删除<p> </p> 序列。 b) 删除段落中的结束和开始空格。 我正在这样做:

preg_replace("#<p>\s*</p>#","",$str);
preg_replace("#\s?(</?p>)\s?#", '$1', $str);

但两者都没有取代任何东西。我做错了什么,不完全正确?

编辑:原代码

$source=preg_replace("#\s?(</?p>)\s?#", '$1', $source); //Replace possible innecessary blank spaces
return preg_replace("#<p>\s*</p>#","",$source); //Delete all posible empty pharagraphs

谢谢你:D

【问题讨论】:

  • @JackManey 这很有趣......但是,我还能如何使用 HTML 解析器呢?我正在使用 HTMLpurifier,我能做的最酷的事情是修复一些错误的标签……但是,这两个必需的东西?你能帮我,而不是说:“用正则表达式做不可能的事!”..而且,让我的问题看起来像一个否定的巢?,为什么?...

标签: regex pcre


【解决方案1】:
$source = preg_replace('#<p>\s*</p>|(?<=<p>)\s+|\s+(?=</p>)#', '', $source);

使用单引号使反斜杠更清晰。你的意思是\s还是\s?幸运的是,在这种情况下,这无关紧要。

上面的 PCRE 将删除

标签之间只有空格(或没有空格),

之后的空格和

之前的空格。不过,我不明白为什么您的原始代码不起作用。您应该在任何

标记之前或之后删除一个空格(即 " &lt;/p&gt; " 将变为 "&lt;/p&gt;"

如果您仍然遇到问题,您需要发布更多代码。您是否正确传递了变量等?尝试为您的问题编写一个最小案例并发布整个程序。

【讨论】:

    【解决方案2】:

    您需要将其分配回$str

    $str = preg_replace ($pattern, $replacement, $str);
    

    请确保您没有处理某些特殊类型的空白。如果是,则使用复杂模式:

    $pattern = '/<p>(&nbsp;|[\s\p{Z}\p{C}\x85\xA0\x{0085}\x{00A0}\x{FFFD}]+)*<\/p>/iu';
    

    要删除段落中的开始和结束空格,请使用模式:

    $pattern = '/(?<=<p>)(&nbsp;|[\s\p{Z}\p{C}\x85\xA0\x{0085}\x{00A0}\x{FFFD}]+)*/iu';
    $pattern = '/(&nbsp;|[\s\p{Z}\p{C}\x85\xA0\x{0085}\x{00A0}\x{FFFD}]+)*(?=<\/p>)/iu';
    

    【讨论】:

    • jmm... 我正在做。但是,为什么要更改变量名?在将要分配给的同一变量上使用该函数是否不正确?我要编辑以保留原始代码。
    【解决方案3】:

    第二个正则表达式将不起作用,因为没有 &lt;/p&gt; 了,你需要先运行它。为什么你需要正则表达式来删除空格,你可以使用 trim

    $str = trim(preg_replace("#<p>(.*)</p>#Us", "$1", $str));
    

    但您可能不应该使用正则表达式来解析 html,因为在 stackoverflow 上提到了很多次。

    编辑:

    preg_replace("/\s*<\/?p>\s*/", "", $str);
    

    【讨论】:

    • 第一次替换后还有一个

      序列,因为我要删除的唯一内容是空格并恢复&lt;p&gt;/&lt;/p&gt;。使用 trim(),我认为它不会删除中间空格。我在这之后使用了 html 解析器,因为首先我需要做一些 BBCODE 到 HTML 的转换。谢谢你的回答,但是……这两个表达都正确吗?
    • @Kenedy 你已经更新了你的代码,我指的是第一个。我用一个正则表达式更新 anwser。
    • 您的版本仍然无法使用。这与我的通过多个空格更改可选空格相同......为什么我的问题变成了这么多否定?这是一个真正的问题,并且解释得很好...... jmmm......:S
    • 我忘了关闭/。它在一次调用中删除标签,标签前后有空格。
    • 是的,我注意到缺少的斜线。但这仍然与我的示例相同。这就是我发布问题的原因...因为这两个示例(您的和我的)都是格式良好的表达...再次感谢您,但是...您知道为什么会遇到麻烦吗?
    猜你喜欢
    • 1970-01-01
    • 2016-03-30
    • 1970-01-01
    • 1970-01-01
    • 2014-08-05
    • 1970-01-01
    • 2013-05-01
    • 2013-09-08
    • 2019-08-26
    相关资源
    最近更新 更多