Regex HTML Tricky

У меня есть эта строка регулярных выражений, но она не работает, возможно, из-за перевода строки? Моя цель — извлечь имя и номер телефона пассажира.

Вот фрагмент данных, которые у меня есть … это в цикле из 100 ниже:

<div class="booking-section">
<h4>Passenger Details</h4>
<p>
<b>Passenger Name:</b><br />
Ms Wendy Walker-hunter
</p>

<p>
<b>Mobile Number:</b><br />
161525961468
</p>

В настоящее время я просто пытаюсь получить имя пассажира первым …

$re = '/(?<=Name)(.*)(?=Mobile)/s';
preg_match($re, $str, $matches);

// Print the entire match result
print_r($matches);

Любая помощь, которую я могу получить в этом, очень ценится!

0

Решение

Это должно работать, если фрагменты всегда форматируются как пример, это зависит от новых строк:

$t = '
<div class="booking-section">
<h4>Passenger Details</h4>
<p>
<b>Passenger Name:</b><br />
Ms Wendy Walker-hunter
</p>
<p>
<b>Mobile Number:</b><br />
161525961468
</p>
</div>';

preg_match('/Passenger Name:[^\r?\n]+\r?\n([^\r?\n]+)\r?\n/', $t, $name);

preg_match('/Mobile Number:[^\r?\n]+\r?\n([^\r?\n]+)\r?\n/', $t, $phone);

echo trim($name[1]), ' / ', trim($phone[1]);

Outpus является: г-жа Венди Уокер-охотник / 161525961468

То же самое с preg_match_all:

$t = '
<div class="booking-section">
<h4>Passenger Details</h4>
<p>
<b>Passenger Name:</b><br />
Ms Wendy Walker-hunter
</p>
<p>
<b>Mobile Number:</b><br />
161525961468
</p>
</div>
<div class="booking-section">
<h4>Passenger Details</h4>
<p>
<b>Passenger Name:</b><br />
Ms Wendy Walker-hunter 2
</p>
<p>
<b>Mobile Number:</b><br />
161525961468 2
</p>
</div>
<div class="booking-section">
<h4>Passenger Details</h4>
<p>
<b>Passenger Name:</b><br />
Ms Wendy Walker-hunter 3
</p>
<p>
<b>Mobile Number:</b><br />
161525961468 3
</p>
</div>';

preg_match_all('/Passenger Name:[^\r?\n]+\r?\n([^\r?\n]+)\r?\n/', $t, $name);

preg_match_all('/Mobile Number:[^\r?\n]+\r?\n([^\r?\n]+)\r?\n/', $t, $phone);

echo '<pre>';
print_r($name);
print_r($phone);
die;

Вывод что-то вроде

Array
(
[1] => Array
(
[0] =>     Ms Wendy Walker-hunter
[1] =>     Ms Wendy Walker-hunter 2
[2] =>     Ms Wendy Walker-hunter 3
)

)
Array
(
[1] => Array
(
[0] =>     161525961468
[1] =>     161525961468 2
[2] =>     161525961468 3
)

)
0

Другие решения

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

$html = '<div class="booking-section">
<h4>Passenger Details</h4>
<p>
<b>Passenger Name:</b><br />
Ms Wendy Walker-hunter
</p>

<p>
<b>Mobile Number:</b><br />
161525961468
</p>
</div>
<div class="booking-section">
<h4>Passenger Details</h4>
<p>
<b>Passenger Name:</b><br />
Mr John Walker
</p>

<p>
<b>Mobile Number:</b><br />
16153682486
</p>
</div>
';
libxml_use_internal_errors(true);
$dom = new DomDocument();
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$results = $xpath->query("//div[@class='booking-section']/p[1]/text()[normalize-space()]");
foreach ($results as $node) {
echo trim($node->textContent) . "\n";
}

Это использует запрос XPath, чтобы получить искомые узлы:

//div[@class='booking-section']/p[1]/text()[normalize-space()]

Это говорит о том, что нужно выбирать пустые текстовые узлы с <p> элемент внутри <div> с class атрибут «раздел бронирования».


В соответствии с документация:

эта функция может генерировать E_WARNING ошибки при обнаружении плохой разметки. Libxml-х функции обработки ошибок может использоваться для обработки этих ошибок.

Для этого примера я включил внутреннюю обработку ошибок в libxml, чтобы подавить любые предупреждения о HTML, хотя, конечно, вы не должны выводить предупреждения пользователям в любом случае.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector