【问题标题】:PHP Regex to remove last paragraph and contentsPHP Regex 删除最后一段和内容
【发布时间】:2015-09-04 21:11:44
【问题描述】:

我在 MySQL 表中存储了以下内容:

<p>First paragraph</p><p>Second paragraph</p><p>Third paragraph</p><div class="item"><p>Some paragraph here</p><p><strong><u>Specs</u>:</strong><br /><br /><strong>Weight:</strong> 10kg<br /><br /><strong>LxWxH:</strong> 5mx1mx40cm</p><p>This is the paragraph I am trying to remove with regex.</p></div>

我正在尝试删除表格中每一行的最后一个段落标签和内容。我可以很容易地用 PHP 循环遍历表格,但是正则表达式让我很难过。

我在 stackoverflow 上找到的每个 preg_match 要么给我一个“preg_match(): Unknown modifier”错误,要么 var_dump 显示一个空数组。我相信即使它确实有效也只会匹配内容,所以我认为我需要 preg_replace?

行的长度不相同,但它始终是我要完全删除的最后一段。

如果有人能告诉我怎么做,将不胜感激。谢谢

【问题讨论】:

  • 你有什么正则表达式? Unknown modifier 通常意味着您没有使用分隔符,或者您在未转义的表达式中使用分隔符。
  • 嗯,我目前拥有的是:- preg_match('/

    ([^$/', $description, $matches); var_dump($matches); - 这只是给了我一个空数组。

  • $ 正在寻找字符串的结尾,而不是您的目标结尾。我会写一些应该能够处理这个问题的东西。你应该考虑在未来使用 HTML/XML 解析器,这很快就会变得一团糟。

标签: php regex html-parsing


【解决方案1】:

没有正则表达式的解决方案是

$string = '<p>First paragraph</p><p>Second paragraph</p><p>Third paragraph</p><div 
class="item"><p>Some paragraph here</p><p><strong><u>Specs</u>:</strong><br /><br /> 
<strong>Weight:</strong> 10kg<br /><br /><strong>LxWxH:</strong> 5mx1mx40cm</p><p>This 
is the paragraph I am trying to remove with regex.</p></div>';

$lastOccurenceOfEnd = strrpos($string,"</p>");
$lastOccurenceOfStart = strrpos($string,"<p>");
$removedParagraph = substr_replace($string, '', $lastOccurenceOfStart, 
$lastOccurenceOfEnd-$lastOccurenceOfStart+4);

echo $removedParagraph; 

【讨论】:

    【解决方案2】:

    这将删除最后一个&lt;p&gt;anything&lt;/p&gt;

    <?php
    $html = '<p>First paragraph</p><p>Second paragraph</p><p>Third paragraph</p><div class="item"><p>Some paragraph here</p><p><strong><u>Specs</u>:</strong><br /><br /><strong>Weight:</strong> 10kg<br /><br /><strong>LxWxH:</strong> 5mx1mx40cm</p><p>This is the paragraph I am trying to remove with regex.</p></div>';
    $html = preg_replace('~(.*)<p>.*?</p>~', '$1', $html);
    echo $html;
    

    (.*) 正在抓取直到最后一个段落标记的所有内容并将其存储。 .*? 抓取段落标记之间的所有内容,? 告诉它在下一个结束段落标记处停止。我们在这里不使用捕获,因为我们不在乎里面是什么。 $1 是在最后一个&lt;p&gt; 之前找到的内容。 ~ 是分隔符,告诉正则表达式的开始和结束位置。我怀疑这是导致您的正则表达式当前失败的原因。 http://php.net/manual/en/regexp.reference.delimiters.php

    输出:

    <p>First paragraph</p><p>Second paragraph</p><p>Third paragraph</p><div class="item"><p>Some paragraph here</p><p><strong><u>Specs</u>:</strong><br /><br /><strong>Weight:</strong> 10kg<br /><br /><strong>LxWxH:</strong> 5mx1mx40cm</p></div>
    

    注意:您应该考虑使用 XML/HTML 解析器,因为带有 HTML/XML 的正则表达式很快就会变得非常混乱。

    http://php.net/manual/en/refs.xml.php
    How do you parse and process HTML/XML in PHP?

    演示: http://sandbox.onlinephpfunctions.com/code/0ddf46c328323e8b6357313a5464733ff797bc3f

    【讨论】:

    • 好点。如果 HTML 包含类似 它也可以摆脱正则表达式。
    • 谢谢,这很完美。我将看一下 XML 解析器,因为我认为这种问题会在这个项目中再次出现。一个旧数据库,其中存储了大量 HTML :(
    猜你喜欢
    • 2016-04-06
    • 1970-01-01
    • 2012-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-12
    • 1970-01-01
    相关资源
    最近更新 更多