У меня есть эта строка регулярных выражений, но она не работает, возможно, из-за перевода строки? Моя цель — извлечь имя и номер телефона пассажира.
Вот фрагмент данных, которые у меня есть … это в цикле из 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);
Любая помощь, которую я могу получить в этом, очень ценится!
Это должно работать, если фрагменты всегда форматируются как пример, это зависит от новых строк:
$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
)
)
Никогда разбирать 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, хотя, конечно, вы не должны выводить предупреждения пользователям в любом случае.