如何使用preg_replace替换多行上的文本

时间:2010-01-20 12:51:45

标签: php

您在html页面中有以下内容可以拉伸多行

<div class="c-fc c-bc" id="content">
                <span class="content-heading c-hc">Heading 1 </span><br />
                The Home Page must provide a introduction to the services provided.<br />
                <br />
                <span class="c-sc">Sub Heading</span><br />
                The Home Page must provide a introduction to the services provided.<br />
                <br />
                <span class="c-sc">Sub Heading</span><br /> 
                The Home Page must provide a introduction to the services provided.<br />
            </div>

我需要使用自定义文字

替换<div class="c-fc c-bc" id="content"></div>之间的覆盖

我使用以下代码来完成此操作但如果它是多行则不想工作,但如果evertinh在一行中则有效

$body = file_get_contents('../../templates/'.$val['url']);

$body = preg_replace('/<div class=\"c\-fc c\-bc\" id=\"content\">(.*)<\/div>/','<div class="c-fc c-bc" id="content">abc</div>',$body);

我错过了什么吗?

5 个答案:

答案 0 :(得分:24)

如果这不是HTML,我会告诉您使用DOTALL修饰符将.的含义从'匹配除新行之外的所有内容'更改为'匹配所有内容':

preg_replace('/(.*)<\/div>/s','abc',$body);

但这是HTML,所以请改用HTML解析器。

答案 1 :(得分:15)

它是“s”标志,它启用。捕获换行符

答案 2 :(得分:0)

可以使用正则表达式去除html数据的块,但是你需要用自定义的html标记包装html,这些标记会被浏览器忽略。例如:

<?php
$html='
<div>This will be shown</div>
<custom650 rel="nofollow">
  <p class="subformedit">
    <a href="#" class="mylink">Link</a>
    <div class="morestuff">
      ... more html in here ...
    </div>
  </p>
</custom650>
<div>This will also be shown</div>
';

要使用rel =“nofollow”属性去除标记,可以使用以下正则表达式:

$newhtml = preg_replace('/<([^\s]+)[^>]*rel="nofollow"[^>]*>.*?<\/\1>/si', '', $html);

根据经验,在新行上启动自定义标记。毫无疑问是一个黑客,但可能会帮助别人。

答案 3 :(得分:0)

您还可以使用[\s\S]代替.与DOTALL标志s结合使用,以便匹配每个人,因为[\s\S]表示完全相同:匹配所有内容; \ s匹配所有空格字符(包括换行符)和\ S处理不是空格字符的所有内容(即其他所有内容)。在某些情况下/正则表达式的实现中,这比启用DOTALL

更好

警告:.*带有DOTALL标志以及[\s\S]都是&#34;饥饿&#34;并且不会停止阅读字符串。如果您希望它们停在某个位置(例如第一个&lt; / div&gt; ),请使用量词后面的非贪婪运算符?,例如.*?

答案 4 :(得分:0)

如何替换嵌套标签之间的文本,例如:

$sExample2 = "Test [DIV]again[/DIV]
d[COLOR=rgb(184, 49, 47)][SIZE=26px][B][U]o[/U][/B][/SIZE][/COLOR]ssed

This is not [DIV]true[/DIV] !

Yes it is [DIV]true [DIV]but[/DIV] just [/DIV] in that case!.

Why not [DIV]now

?[/DIV] Right here.

Because it is [DIV]down
[DIV]to the [/DIV][/DIV] botton.

I know but i want to [DIV]fly
[DIV]far[/DIV]
[/DIV] away.

";

我想用 * Help * 替换每个 DIV 元组,使结果看起来像

Test ** Test **
d[COLOR=rgb(184, 49, 47)][SIZE=26px][B][U]o[/U][/B][/SIZE][/COLOR]ssed

This is not ** Test ** !

Yes it is ** Test ** in that case!.

Why not ** Test **
 Right here.

Because it is ** Test ** 
botton.

I know but i want to ** Test **
 away.

我尝试了不同的替换,但从未收到过这样的结果。

print_r(preg_replace(
            '#\[' . preg_quote('DIV', '#') . '](.*?)\[\/' . preg_quote('DIV', '#') . '\]#si',
            '*** Test ***',
            $sExample2
        ));

这个几乎是最好的,但不是我需要的。