PHP返回多个匹配相同的正则表达式模式
我有以下HTML:PHP返回多个匹配相同的正则表达式模式,php,regex,Php,Regex,我有以下HTML: <tr valign="top"> <td>Name:</td> <td>John Doe</td> </tr> <tr><td colspan="2"> </td></tr> <tr valign="top"> <td>Address:</td>
<tr valign="top">
<td>Name:</td>
<td>John Doe</td>
</tr>
<tr><td colspan="2"> </td></tr>
<tr valign="top">
<td>Address:</td>
<td>71 view st, Fitchburg, MA 01420</td>
</tr>
<tr><td colspan="2"> </td></tr>
<tr valign="top">
<td>Phone:</td>
<td>978-345-5391</td>
</tr>
<tr><td colspan="2"> </td></tr>
<tr>
<td>Email:</td>
<td>johndoe@cs.com</td>
</tr>
如果我单独尝试,例如:
$pattern = "/Name:<\/td>\s*<td>(.*)<\/td>/m";
$pattern = "/Phone:<\/td>\s*<td>(.*)<\/td>/m";
$pattern = "/Email:<\/td>\s*<td>(.*)<\/td>/m";
$pattern=“/Name:\s*(.*)/m”;
$pattern=“/Phone:\s*(.*)/m”;
$pattern=“/Email:\s*(.*)/m”;
没关系。也许我不明白正则表达式是如何工作的,在一个模式中不可能有更多的匹配项吗?显示多行正则表达式的示例。 1.不是问题的最佳解决方案,但说明了能力。 2.不是最好的正则表达式,但关键是末尾的
s
标志
<?php
$html = <<<EOL
<tr valign="top">
<td>Name:</td>
<td>John Doe</td>
</tr>
<tr><td colspan="2"> </td></tr>
<tr valign="top">
<td>Address:</td>
<td>71 view st, Fitchburg, MA 01420</td>
</tr>
<tr><td colspan="2"> </td></tr>
<tr valign="top">
<td>Phone:</td>
<td>978-345-5391</td>
</tr>
<tr><td colspan="2"> </td></tr>
<tr>
<td>Email:</td>
<td>johndoe@cs.com</td>
</tr>
EOL;
$pattern = "#Name:</td>.*<td>(.*?)</td>.*Address:</td>.*<td>(.*?)</td>.*Phone:</td>.*<td>(.*?)</td>.*Email:</td>.*<td>(.*?)</td>#s";
if(preg_match($pattern, $html, $matches)) {
printf("Name: %s\n", $matches[1]);
printf("Address: %s\n", $matches[2]);
printf("Phone: %s\n", $matches[3]);
printf("Email: %s\n", $matches[4]);
}
?>
显示多行正则表达式的示例。 1.不是问题的最佳解决方案,但说明了能力。 2.不是最好的正则表达式,但关键是末尾的
s
标志
<?php
$html = <<<EOL
<tr valign="top">
<td>Name:</td>
<td>John Doe</td>
</tr>
<tr><td colspan="2"> </td></tr>
<tr valign="top">
<td>Address:</td>
<td>71 view st, Fitchburg, MA 01420</td>
</tr>
<tr><td colspan="2"> </td></tr>
<tr valign="top">
<td>Phone:</td>
<td>978-345-5391</td>
</tr>
<tr><td colspan="2"> </td></tr>
<tr>
<td>Email:</td>
<td>johndoe@cs.com</td>
</tr>
EOL;
$pattern = "#Name:</td>.*<td>(.*?)</td>.*Address:</td>.*<td>(.*?)</td>.*Phone:</td>.*<td>(.*?)</td>.*Email:</td>.*<td>(.*?)</td>#s";
if(preg_match($pattern, $html, $matches)) {
printf("Name: %s\n", $matches[1]);
printf("Address: %s\n", $matches[2]);
printf("Phone: %s\n", $matches[3]);
printf("Email: %s\n", $matches[4]);
}
?>
通过正则表达式解析html标记通常不是一种好方法。这是非常不可靠和复杂的。请看一看
DOM解析器
。这些都是完成这类任务的正确工具。我知道,我不能使用DOM,因为我的文件没有任何完整的HTML标记,只有表等等,所以我不能访问DOM。这并不意味着你不能使用DOM解析器!只需将该表定义嵌入到一个简约的HTML框架中即可。你可以用正则表达式。您需要在末尾添加一个s
标志,以便将换行符
计算为空白。2.你的正则表达式不匹配。3.使用
而不是/
作为正则表达式分隔符更容易,因为你的草堆里有/
。为什么人们会否决这个问题?这是一个直截了当的问题,用正则表达式解析html标记通常不是一个好方法。这是非常不可靠和复杂的。请看一看DOM解析器
。这些都是完成这类任务的正确工具。我知道,我不能使用DOM,因为我的文件没有任何完整的HTML标记,只有表等等,所以我不能访问DOM。这并不意味着你不能使用DOM解析器!只需将该表定义嵌入到一个简约的HTML框架中即可。你可以用正则表达式。您需要在末尾添加一个s
标志,以便将换行符
计算为空白。2.你的正则表达式不匹配。3.使用
而不是/
作为正则表达式分隔符更容易,因为你的草堆里有/
。为什么人们会否决这个问题?这是一个直截了当的问题。
Name: John Doe
Address: 71 view st, Fitchburg, MA 01420
Phone: 978-345-5391
Email: johndoe@cs.com