正则表达式的不寻常行为

时间:2012-10-26 15:55:55

标签: php regex preg-match

我的设置:

的index.php:

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

a.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>之间的内容。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

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
)

答案 2 :(得分:0)

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

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

正则表达式中的|代表or