ホームページ  >  記事  >  バックエンド開発  >  关于preg_match_all返回的数组

关于preg_match_all返回的数组

WBOY
WBOYオリジナル
2016-06-06 20:43:501598ブラウズ

我想用正则表达式匹配html的

标签内的
用的正则表达式是 #(.*)#

因为匹配的原文 其实就是一个有规律的表格 我想要将匹配出来的多个结果分别存入数据库中

但是返回的二维数组我不明白
我的理解是第一维的结果是正常匹配出来的结果 然后第二维是在一维的结果内再进行匹配吗 但是实际出来第一维数组和第二维数组是一样的呀

我找到一个preg_match参数
参数说明:
参数 说明
pattern 正则表达式
subject 需要匹配检索的对象
matches 可选,存储匹配结果的数组, $matches[0] 将包含与整个模式匹配的文本,$matches[1] 将包含与第一个捕获的括号中的子模式所匹配的文本,以此类推

(o.o 类推你妹呀 看不懂呀 初学者让大家)

代码如下

<code><?php // 用正则表达式 匹配 TR标签 第二个TR标签 为第一大节课  对该段标签 再去匹配td标签  结果有7个  依次为 星期一到星期天第一节课的内容
$test = "
<TBODY>
<tr bgcolor="#eeeeee">
<td width='\"9%\"'>
<div align="center"> </div>
</td>
<td width='\"13%\"'>
<div align="center">星期一</div>
</td>
<td width='\"13%\"'>
<div align="center">星期二</div>
</td>
<td width='\"13%\"'>
<div align="center">星期三</div>
</td>
<td width='\"13%\"'>
<div align="center">星期四</div>
</td>
<td width='\"13%\"'>
<div align="center">星期五</div>
</td>
<td width='\"13%\"'>
<div align="center">星期六</div>
</td>
<td width='\"13%\"'>
<div align="center">星期日</div>
</td>
</tr>

<tr>
<td valign="center" bgcolor="#eeeeee">
<div align="center">第一大节</div>
</td>
<td valign="top" align="center">11</td>

<td valign="top" align="center">12</td>

<td valign="top" align="center">13</td>

<td valign="top" align="center">14</td>

<td valign="top" align="center">15</td>

<td valign="top" align="center">16</td>

<td valign="top" align="center">17</td>

</tr>
<tr>
<td valign="center" bgcolor="#eeeeee">
<div align="center">第二大节</div>
</td>
<td valign="top" align="center">21;</td>

<td valign="top" align="center">22</td>

<td valign="top" align="center">形势与政策(6)<br>第10周<br>吕志和礼堂 白文杰</td>

<td valign="top" align="center">24</td>

<td valign="top" align="center">25</td>

<td valign="top" align="center">26</td>

<td valign="top" align="center">27</td>

</tr>
<tr>
<td valign="center" bgcolor="#eeeeee">
<div align="center">第三大节</div>
</td>
<td valign="top" align="center"> </td>

<td valign="top" align="center">英语</td>

<td valign="top" align="center"> </td>

<td valign="top" align="center"> </td>

<td valign="top" align="center"> </td>

<td valign="top" align="center">数学</td>

<td valign="top" align="center"> </td>

</tr>
<tr>
<td valign="center" bgcolor="#eeeeee">
<div align="center">第四大节</div>
</td>
<td valign="top" align="center"> </td>

<td valign="top" align="center"> </td>

<td valign="top" align="center"> </td>

<td valign="top" align="center">音乐</td>

<td valign="top" align="center"> </td>

<td valign="top" align="center"> </td>

<td valign="top" align="center"> </td>

</tr>
<tr>
<td valign="center" bgcolor="#eeeeee">
<div align="center">晚 上</div>
</td>
<td valign="top" align="center"> </td>

<td valign="top" align="center"> </td>

<td valign="top" align="center"> </td>

<td valign="top" align="center"> </td>

<td valign="top" align="center"> </td>

<td valign="top" align="center"> </td>

<td valign="top" align="center"> </td>

</tr>

<tr>

";





function trimall($str)//删除全部空格
{
    $qian=array(" "," ","\t","\n","\r");$hou=array("","","","","");
    return str_replace($qian,$hou,$str);    
}
$test = trimall($test);


$match = "#</tr>
<tr>(.*)</tr>#";
preg_match_all($match,$test,$TR);
print_r($TR);

?>
</code>

回复内容:

我想用正则表达式匹配html的

标签内的
用的正则表达式是 #(.*)#

因为匹配的原文 其实就是一个有规律的表格 我想要将匹配出来的多个结果分别存入数据库中

但是返回的二维数组我不明白
我的理解是第一维的结果是正常匹配出来的结果 然后第二维是在一维的结果内再进行匹配吗 但是实际出来第一维数组和第二维数组是一样的呀

我找到一个preg_match参数
参数说明:
参数 说明
pattern 正则表达式
subject 需要匹配检索的对象
matches 可选,存储匹配结果的数组, $matches[0] 将包含与整个模式匹配的文本,$matches[1] 将包含与第一个捕获的括号中的子模式所匹配的文本,以此类推

(o.o 类推你妹呀 看不懂呀 初学者让大家)

代码如下

<code><?php // 用正则表达式 匹配 TR标签 第二个TR标签 为第一大节课  对该段标签 再去匹配td标签  结果有7个  依次为 星期一到星期天第一节课的内容
$test = "
<TBODY>
<tr bgcolor="#eeeeee">
<td width='\"9%\"'>
<div align="center"> </div>
</td>
<td width='\"13%\"'>
<div align="center">星期一</div>
</td>
<td width='\"13%\"'>
<div align="center">星期二</div>
</td>
<td width='\"13%\"'>
<div align="center">星期三</div>
</td>
<td width='\"13%\"'>
<div align="center">星期四</div>
</td>
<td width='\"13%\"'>
<div align="center">星期五</div>
</td>
<td width='\"13%\"'>
<div align="center">星期六</div>
</td>
<td width='\"13%\"'>
<div align="center">星期日</div>
</td>
</tr>

<tr>
<td valign="center" bgcolor="#eeeeee">
<div align="center">第一大节</div>
</td>
<td valign="top" align="center">11</td>

<td valign="top" align="center">12</td>

<td valign="top" align="center">13</td>

<td valign="top" align="center">14</td>

<td valign="top" align="center">15</td>

<td valign="top" align="center">16</td>

<td valign="top" align="center">17</td>

</tr>
<tr>
<td valign="center" bgcolor="#eeeeee">
<div align="center">第二大节</div>
</td>
<td valign="top" align="center">21;</td>

<td valign="top" align="center">22</td>

<td valign="top" align="center">形势与政策(6)<br>第10周<br>吕志和礼堂 白文杰</td>

<td valign="top" align="center">24</td>

<td valign="top" align="center">25</td>

<td valign="top" align="center">26</td>

<td valign="top" align="center">27</td>

</tr>
<tr>
<td valign="center" bgcolor="#eeeeee">
<div align="center">第三大节</div>
</td>
<td valign="top" align="center"> </td>

<td valign="top" align="center">英语</td>

<td valign="top" align="center"> </td>

<td valign="top" align="center"> </td>

<td valign="top" align="center"> </td>

<td valign="top" align="center">数学</td>

<td valign="top" align="center"> </td>

</tr>
<tr>
<td valign="center" bgcolor="#eeeeee">
<div align="center">第四大节</div>
</td>
<td valign="top" align="center"> </td>

<td valign="top" align="center"> </td>

<td valign="top" align="center"> </td>

<td valign="top" align="center">音乐</td>

<td valign="top" align="center"> </td>

<td valign="top" align="center"> </td>

<td valign="top" align="center"> </td>

</tr>
<tr>
<td valign="center" bgcolor="#eeeeee">
<div align="center">晚 上</div>
</td>
<td valign="top" align="center"> </td>

<td valign="top" align="center"> </td>

<td valign="top" align="center"> </td>

<td valign="top" align="center"> </td>

<td valign="top" align="center"> </td>

<td valign="top" align="center"> </td>

<td valign="top" align="center"> </td>

</tr>

<tr>

";





function trimall($str)//删除全部空格
{
    $qian=array(" "," ","\t","\n","\r");$hou=array("","","","","");
    return str_replace($qian,$hou,$str);    
}
$test = trimall($test);


$match = "#</tr>
<tr>(.*)</tr>#";
preg_match_all($match,$test,$TR);
print_r($TR);

?>
</code>

请问你理解了这句话吗?
$matches[1] 将包含与第一个捕获的括号中的子模式所匹配的文本,括号指的是什么?

理解之后,我在提醒下,你的$matches[0]肯定比$matches[1]要多 TR 这个标签吧?

preg_match_all不是匹配一次就停止,而是匹配完得到所有的结果。所以$matches[0]就不是string而是array of string。然后每个匹配得到的表达式都对应一个子串,所以[1]同理。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。