Как заменить текст на несколько строк, используя preg_replace - PullRequest
11 голосов
/ 20 января 2010

Привет, есть следующий контент на 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);

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

Ответы [ 4 ]

25 голосов
/ 20 января 2010

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

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

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

15 голосов
/ 26 января 2010

это флаг "s", он разрешает. захватить новые строки

0 голосов
/ 17 апреля 2018

вы также можете использовать [\s\S] вместо . в сочетании с флагом DOTALL s для сопоставления каждого, потому что [\s\S] означает абсолютно то же самое: сопоставить все; \ s соответствует всем пробелам (включая символ новой строки) и \ S обрабатывает все, что не является пробелом (то есть все остальное). в некоторых случаях / реализации регулярных выражений это работает лучше, чем включение DOTALL

Осторожно: .* с флагом DOTALL и [\s\S] оба "голодны" и не остановят чтение строки. если вы хотите, чтобы они остановились в определенной позиции (например, в первом ), используйте некожадный оператор ? за квантификатором, например, .*?

0 голосов
/ 07 февраля 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...