Соответствие шаблону из нескольких строк с помощью PHP preg_match () - PullRequest
28 голосов
/ 22 января 2012

Как мне сопоставить subject через шаблон регулярного выражения PHP preg_match () в этом HTML-коде:

      <table border=0>
  <tr>
  <td>


  <h2>subject</h2>



    </td>

Все пробелы и символы новой строки оставлены специально.Таким образом, проблема заключается в извлечении имени субъекта с использованием некоторого шаблона из нескольких строк.

Ответы [ 5 ]

55 голосов
/ 22 января 2012

Если вы ищете (например) тег h2, вложенный в тег a td, где между ними есть только пробел, просто используйте \s, который включает пробелы, символы новой строки,и т. д. например ::

preg_match('#<td>\s*<h2>(.*?)</h2>\s*</td>#i',$str,$matches);
// result is in $matches[1]

См. это в действии здесь .

Для вашего интереса, здесь это список различных модификаторов, которые выможет передавать функции preg_*.Флаги, которые могут вас заинтересовать:

  • s ("dotall"): этот флаг заставляет . соответствовать каждому символу, , включая переводы строки.Итак, скажем, ваш <h2>.....</h2> был разбит на несколько строк.Тогда вам нужно будет сделать

    preg_match('#<td>\s*<h2>(.*?)</h2>\s*</td>#is',$str,$matches);
    

    , чтобы .* прошел через несколько строк (см. Дополнительные s в конце регулярного выражения?).

  • m («многострочный»): этот параметр позволяет ^ и $ соответствовать началу / концу строки , а не только началу / концу строки ,Вам это действительно нужно, только если вы используете ^ и $ в своем паттерне и хотите, чтобы они совпадали с началом / концом каждой отдельной строки в вашем входе.
13 голосов
/ 26 мая 2013

Вы можете добавить оператор m к своему регулярному выражению:

// Given your HTML content.
$html = 'Your HTML content';
preg_match('/<td[^>]*>(.*?)<\/td>/im', $html, $matches);

Надеюсь, это (все еще) помогает, хахаха.

3 голосов
/ 22 января 2012

Очень просто с

preg_match('/<h2>(.*?)<\\/h2>/', $str, $matches);
print($matches[1]);

Многострочный формат не влияет на регулярное выражение, если вам не нужно сопоставлять строку, которая занимает несколько строк.

1 голос
/ 25 апреля 2016

Вы не должны использовать регулярные выражения для анализа содержимого HTML. Это может вызвать много проблем, если вы не можете контролировать то, что пользователь может ввести. Есть много лучших решений на каждом языке. Синтаксический анализатор XML в большинстве случаев работает лучше. Проверьте DOMDocument , simplehtmldom или php-html-parser

См. Здесь для получения дополнительных ответов, почему вы не должны использовать регулярное выражение для содержимого HTML: RegEx соответствует открытым тегам, кроме автономных тегов XHTML

0 голосов
/ 13 марта 2016

Вы должны удалить все разрывы строк, используя \s в регулярном выражении:

$str ="<ol>
         <li>Capable for unlimited product</li>
         <li>Two currency support</li>
         <li>Works with touch screens and click screen based systems</li>
         <li>Responsive design <b>shopping cart</b>, Specially design for Mac, iPhone, iPad, PC and Android</li>
         <li>VAT for countries that support a Value Added Tax</li>
         <li>Barcode scanner checkout option for POS</li>
         <li>mRSS</li>
       </ol>";

preg_match("/^([A-Za-z0-9\s\<\>\.\,\/\-\ ]+)$/", $str);

// Sanitize your code before save to database.

function test_input($data) {
    $data = trim($data);
    $data = htmlspecialchars($data);
    $data = json_encode($data);
    $data = addslashes($data);
    return $data;
}

echo test_input($str);
...