我有这个正则表达式行,但它可能因为换行而无法正常工作?我的目标是提取乘客姓名和电话号码。
以下是我所拥有的数据片段......它位于以下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 :(得分:1)
Never使用正则表达式解析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
属性为&#34; booking-section。&#34;
此函数遇到错误标记时可能会生成
E_WARNING
错误。 libxml的error handling functions可用于处理这些错误。
我已为此示例启用了libxml的内部错误处理,以禁止显示有关HTML的任何警告,但当然您不应该向用户输出警告。
答案 1 :(得分: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是:Wendy Walker-hunter女士/ 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
)
)