Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP返回多个匹配相同的正则表达式模式_Php_Regex - Fatal编程技术网

PHP返回多个匹配相同的正则表达式模式

PHP返回多个匹配相同的正则表达式模式,php,regex,Php,Regex,我有以下HTML: <tr valign="top"> <td>Name:</td> <td>John Doe</td> </tr> <tr><td colspan="2">&nbsp;</td></tr> <tr valign="top"> <td>Address:</td>

我有以下HTML:

<tr valign="top">
        <td>Name:</td>
        <td>John Doe</td>
</tr>
<tr><td colspan="2">&nbsp;</td></tr>
<tr valign="top">
        <td>Address:</td>
        <td>71 view st, Fitchburg, MA 01420</td>
</tr>
<tr><td colspan="2">&nbsp;</td></tr>
<tr valign="top">
        <td>Phone:</td>
        <td>978-345-5391</td>
</tr>
<tr><td colspan="2">&nbsp;</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">&nbsp;</td></tr>
<tr valign="top">
        <td>Address:</td>
        <td>71 view st, Fitchburg, MA 01420</td>
</tr>
<tr><td colspan="2">&nbsp;</td></tr>
<tr valign="top">
        <td>Phone:</td>
        <td>978-345-5391</td>
</tr>
<tr><td colspan="2">&nbsp;</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">&nbsp;</td></tr>
<tr valign="top">
        <td>Address:</td>
        <td>71 view st, Fitchburg, MA 01420</td>
</tr>
<tr><td colspan="2">&nbsp;</td></tr>
<tr valign="top">
        <td>Phone:</td>
        <td>978-345-5391</td>
</tr>
<tr><td colspan="2">&nbsp;</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