使用PHP preg_replace遇到麻烦 - php

好吧,可以说我有以下内容...

<h2><a name="test1"></a>Test 1</h2>test 1 text
<h2><a name="test2"></a>Test 2</h2>
test 2 text
<h3><a name="test3"></a>Test 3</h3>
test
3
text
<h4><a name="test4"></a>Test 4</h4>
<h4><a name="test5"></a>Test 5</h4>test 5 text

我想使用正则表达式将该文本替换为以下内容:

<div class="toggle">
    <h2><a name="test1"></a>Test 1</h2>
    <div class="contents">test 1 text</div>
</div>
<div class="toggle">
    <h2><a name="test1"></a>Test 2</h2>
    <div class="contents">test 2 text</div>
</div>
<div class="toggle">
    <h3><a name="test1"></a>Test 3</h3>
    <div class="contents">test
3
text</div>
</div>
<div class="toggle">
    <h4><a name="test1"></a>Test 4</h4>
    <div class="contents"></div>
</div>
<div class="toggle">
    <h4><a name="test1"></a>Test 5</h4>
    <div class="contents">test 5 text</div>
</div>

我尝试使用:

$text = preg_replace('#<h(\d+)>(.*?)</h\1>(.*)#si', '<div class="ToggleContents"><h$1>$2</h$1><div class="contents">$3</div></div>', $text);

但是,这样做的问题是它太贪婪了,我还没有弄清楚如何使其变得不贪婪和正常工作。有人有主意吗?

参考方案

$text = '<h2><a name="test1"></a>Test 1</h2> test 1 text
<h2><a name="test2"></a>Test 2</h2> test 2 text
<h3><a name="test3"></a>Test 3</h3> test 3 text
<h4><a name="test4"></a>Test 4</h4> test 4 text
<h4><a name="test5"></a>Test 5</h4> test 5 text';

$text = preg_replace('#<h([1|2|3|4|5|6])>(.*?)</h([1|2|3|4|5|6])>\ (.*?)(\n|$)#si', '
<div class="toggle">
  <h\\1>\\2</h\\1>
  <div class="contents">\\4</div>
</div>
', $text);

<span>解决方案:

$text = '<h2><a name="test1"></a>Test 1</h2><span>test 1 text</span>
<h2><a name="test2"></a>Test 2</h2><span>test 2 text</span>
<h3><a name="test3"></a>Test 3</h3><span>test 3 text</span>
<h4><a name="test4"></a>Test 4</h4><span>test 4 text</span>
<h4><a name="test5"></a>Test 5</h4><span>test 5 text</span>';

$text = preg_replace('#<h([1|2|3|4|5|6])>(.*?)</h([1|2|3|4|5|6])><span>(.*?)</span>#si', '
<div class="toggle">
  <h\\1>\\2</h\\1>
  <div class="contents">\\4</div>
</div>
', $text);

PHP preg_replace和号 - php

好吧,我可能不会以正确的方式解决这个问题,但是这里就来了。我有这个带链接的字符串,并提取标签之间的文本...$string = $item; $pattern = '/\<a([^>]*)\>([^<]*)\<\/a\>/i'; $replacement = '$2'; $messa…

php Singleton类实例将在多个会话中保留吗? - php

举一个简单的例子,如果我想计算一个不使用磁盘存储的脚本的命中次数,我可以使用静态类成员来执行此操作吗?用户1:<?php $test = Example::singleton(); $test->visits++; ?> 用户2:<?php $test = Example::singleton(); $test->visits+…

通过>和<运算符比较日期 - php

在我的所有php代码中,我都在UTC中存储日期和时间,但是我也在使用mysql存储日期时间(也在utc中)。大于和小于运算符会导致日期比较失败吗? $curdate=date('Y-m-d H:i:s'); if($start_datetime>$curdate) 参考方案 不。他们没有办法失败。为此,特意制作了MySQL日期格式。…

我如何在Safari浏览器中支持<video>? - php

我想在野生动物园浏览器中显示视频,当我刷新浏览器时,什么也没有发生,该怎么办?这是我的代码:<!doctype html> <html> <head> <title>Simple Movie Player</title> </head> <body> <video sr…

XPath表达式在<br>标记后获取字符串 - php

我正在尝试获取article/div/p中的内容,但仅获取<br>标记后的日期。怎么做?<article> <h2>Man rescued after falling into Crater Lake</h2> <p class="summary highlight"> Man …