Как заменить текст на несколько строк, используя preg_replace

Привет, на странице 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>

Мне нужно заменить everthing между <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);

Я что-то пропустил?

Ответ 1

Если бы это был не HTML, я бы сказал вам использовать модификатор DOTALL, чтобы изменить значение . from 'match все, кроме новой строки 'to' match all ':

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

Но это HTML, поэтому вместо этого используйте парсер HTML.

Ответ 2

это флаг s, он позволяет. для захвата новых строк

Ответ 3

Можно использовать регулярное выражение для выделения фрагментов 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);

Из опыта запустите пользовательские теги в новой строке. Несомненно, взлом, но может помочь кому-то.