Подтвердить что ты не робот

Соответствие шаблону с несколькими строками через PHP preg_match()

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

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


  <h2>subject</h2>



    </td>

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

4b9b3361

Ответ 1

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

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 ( "multiline" ): этот только позволяет ^ и $ совпадение начала/конца строки, а не только начало/конец строки. Вам это действительно нужно, если вы используете ^ и $ в своем шаблоне и хотите, чтобы они соответствовали началу/концу каждой отдельной строки на вашем входе.

Ответ 2

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

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

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

Ответ 3

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

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

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

Ответ 4

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

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

Ответ 5

Вы должны удалить все разрывы строк, используя \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);