Preg_match和count给出了不好的结果

时间:2014-04-21 21:15:38

标签: php regex

我正在尝试使用preg_match_all获取所有正则表达式,然后检查这些事件中是否存在特定字符串。在那之后,我试图计算和比较出现的次数,但在我看来,它不起作用。我正在使用从数据库中获取的HTML数据,是的,我真的需要HTML的正则表达式。无论我从数据库中获取哪些数据,结果如下:图像预匹配计数:2图像搜索计数:1表格预匹配计数:2表搜索计数:1

这是我的代码段:

$query = $DB->get_field('book_chapters', 'content', array('bookid'=>'1'));

$img_pat = '/<img(.*)\>/i'; //regular expression for image tag search
$table_pat = '/<table(.*)\>/i'; //regular expression for table tag search

echo $query;

$content = serialize($query);

echo $content;

//image
preg_match_all($img_pat, $content, $img_pregmatch);
$img_search = array_search('alt="', $img_pregmatch);

echo 'Image pregmatch count: ' . count($img_pregmatch);
echo 'Image search count: ' . count($img_search);

//table
preg_match_all($table_pat, $content, $table_pregmatch);
$table_search = array_search('summary="', $table_pregmatch);

echo 'Table pregmatch count: ' . count($table_pregmatch);
echo 'Table search count: ' . count($table_search);

这是使用rubular.com时的示例

rubular.com example

任何帮助,建议表示赞赏,谢谢!

3 个答案:

答案 0 :(得分:2)

试试这个:

preg_match_all($img_pat, $content, $img_pregmatch, PREG_SET_ORDER);

options参数的默认值为PREG_MATCH_ORDER,因此$img_pregmatch[0]是整个正则表达式的所有匹配项的数组,$img_pregmatch[N]是捕获的所有匹配项的数组组N.所以count($img_pregmatch)只是捕获组的数量+ 1,而不是匹配的数量。

PREG_SET_ORDER将此反转,因此匹配数组的每个元素对应于字符串中的匹配。

答案 1 :(得分:1)

preg_match_all()将返回一组捕获组。因此$img_pregmatch[0]将包含您的所有匹配项,$img_pregmatch[1]将返回您的所有首批捕获组。

尝试将您的计数更改为:

echo 'Image pregmatch count: ' . count($img_pregmatch[0]);
echo 'Table pregmatch count: ' . count($table_pregmatch[0]);

注意:

您不应该使用regular expressions to parse HTML,因为HTML不是常规语言。

答案 2 :(得分:1)

首先,永远不需要计算preg_match_all 的整体匹配,因为preg_match_all会返回匹配数。因此你可以写:

$count = preg_match_all($regex,$subject,$matches);

如果没有更多的努力,这就是你要找的计数!

接下来,必须?中添加这样的惰性(.*?),否则您可以捕获&#34;超级标记&#34;贪婪地吃了多个img标签。

如果你想知道捕获了多少组1匹配,你可以count($matches[1]),但这不是我们在这里做的。

preg_match_all是一个很棒的功能。我建议您研究这些usages of preg_match_all以了解返回的数组的形成。