1

我的设置:

索引.php:

<?php
$page = file_get_contents('a.html');
$arr = array();
preg_match('/<td class=\"myclass\">(.*)\<\/td>/s',$page,$arr);
print_r($arr);
?>

一个.html:

...other content
<td class="myclass"> 
    THE 
  CONTENT 
</td>
other content...

输出:

Array
(
    [0] => Array
        (
        )
)

如果我将 index.php 的第 4 行更改为:

preg_match('/<td class=\"myclass\">(.*)\<\/t/s',$page,$arr);

输出是:

Array
(
    [0] => <td class="myclass">
     THE 
   CONTENT
</t
    [1] => 
     THE 
   CONTENT
)
 

我不知道出了什么问题。请帮我匹配和之间的<td class="myclass">内容</td>

4

3 回答 3

2

您的代码似乎有效。我编辑了正则表达式以使用不同的分隔符并获得更清晰的视图。如果您的 HTML 中有多个 myclass TD,您可能需要使用 ungreedy 修饰符。

我无法重现您注意到的“数组数组”行为,除非我操纵代码添加错误——见底部。

<?php
        $page = <<<PAGE
        ...other content
        <td class="myclass">
            THE
          CONTENT
        </td>
        other content...
PAGE;

        preg_match('#<td class="myclass">(.*)</td>#s',$page,$arr);
        print_r($arr);
?>

按预期返回:

Array
(
    [0] => <td class="myclass">
            THE
          CONTENT
        </td>
    [1] =>
            THE
          CONTENT

)

下面的代码与您的代码相似,但已被修改为导致相同的错误。不过,您似乎不太可能这样做。修改正则表达式以使其匹配,并将生成的空数组存储到$arr[0]而不是$arr.

preg_match('#<td class="myclass">(.*)</ td>#s',$page,$arr[0]);

返回您观察到的相同错误:

Array
(
    [0] => Array
        (
        )

)

如果我使用您的正则表达式,我可以复制您观察到的相同行为(适用于</t,不适用于</td>),但将 HTML 修改为</t d>. 如果我也想获得相同的输出,我仍然需要写信$arr[0]$arr

于 2012-10-26T16:30:51.003 回答
1

您是否了解第三个参数preg_match是匹配项,它将包含匹配项,然后其他元素将显示捕获的模式。

http://ca3.php.net/manual/en/function.preg-match.php

如果提供了匹配项,则将其填充为搜索结果。$matches[0] 将包含与完整模式匹配的文本,$matches[1] 将包含与第一个捕获的带括号的子模式匹配的文本,依此类推。

这段代码 preg_match('/<td class=\"myclass\">(.*)\<\/t/s',$page,$arr);

应用时

...other content
<td class="myclass"> 
    THE 
  CONTENT 
</td>
other content...

将在 $arr[0] 中返回匹配项,在 $arr[1] 中返回 (.*) 的结果。这个结果是正确的:[1]中有你的内容

Array
(
    [0] => <td class="myclass">
    THE
  CONTENT
</t
    [1] => 
    THE
  CONTENT

示例二

<?php
header('Content-Type: text/plain');
$page = 'A B C D E F';
$arr = array();
preg_match('/C (D) E/', $page, $arr);
print_r($arr);

示例输出

Array
(
    [0] => C D E  // This is the string found
    [1] => D      // this is what I wanted to look for and extracted out of [0], the matched parenthesis
)
于 2012-10-26T16:56:44.943 回答
0

您的正则表达式似乎是正确的。preg_match 的语法不是如下吗?

preg_match('/<td class=\"myclass\">(.*)\<\/td>/s',$page,$arr);

|则表达式中的or

于 2012-10-26T16:10:06.743 回答