PHP 删除最后一段和内容的正则表达式

PHP Regex to remove last paragraph and contents

我将以下内容存储在 MySQL table 中:

<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>

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

我在 Whosebug 上发现的每个 preg_match 要么给我一个 "preg_match(): Unknown modifier" 错误,要么 var_dump 显示一个空数组。我相信这只会匹配内容,即使它确实有效所以我想我需要 preg_replace?

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

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

这将删除最后一个 <p>anything</p>

<?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>~', '', $html);
echo $html;

(.*) 正在抓取最后一段标记之前的所有内容并将其存储。 .*? 抓取段落标签之间的所有内容,? 告诉它在下一个结束段落标签处停止。我们不在这里使用捕获,因为我们不关心里面是什么。 </code> 是在最后一个<code><p> 之前找到的内容。 ~ 是分隔符,用于指示正​​则表达式的开始和结束位置。我怀疑这是导致您的正则表达式当前失败的原因。 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

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

$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;