我将以下内容存储在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?
行的长度不一样,但它总是要我完全删除的最后一段。
如果有人能告诉我如何,我将不胜感激。感谢
答案 0 :(得分:2)
这将删除最后一个<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>~', '$1', $html);
echo $html;
(.*)
抓住所有内容,直到最后一个段落标记并存储它。 .*?
抓取段落标记之间的所有内容,?
告诉它停在下一个结束段落标记。我们不在这里使用捕获因为我们不关心里面是什么。 $1
是在上一个<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
答案 1 :(得分:0)
没有正则表达式的解决方案是
$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;