我正在尝试使用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时的示例
任何帮助,建议表示赞赏,谢谢!
答案 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以了解返回的数组的形成。