PHP正则表达式预匹配所有问题

PHP正则表达式预匹配所有问题,php,regex,Php,Regex,我有这个数组,我想匹配所有ID Array ( [0] => <td><a href="readmail.html?id=xsX321dsa">Hi</a></td> ) 数组 ( [0] => ) 我尝试了这个,但它只是返回一个空结果 preg_match_all("#<td><a href=\"readmail.html?id=(.*?)\">#si",$output[0],$match); pre

我有这个数组,我想匹配所有ID

Array
(
    [0] => <td><a href="readmail.html?id=xsX321dsa">Hi</a></td>
)
数组
(
[0] => 
)
我尝试了这个,但它只是返回一个空结果

preg_match_all("#<td><a href=\"readmail.html?id=(.*?)\">#si",$output[0],$match);
preg#u match_all(“##si”,$output[0],$match);

有人知道这一点吗?

您需要转义
以逐字匹配问号,因为它在正则表达式中有特殊含义

preg_match_all("#<td><a href=\"readmail\.html\\?id=(.*?)\">#si",
               $output[0], $match);
更新您还应该退出
。它匹配任何字符(根据模式换行除外)

更新除了使用
\
进行转义外,还可以使用
\Q
\E
(忽略
\Q
\E
中的元字符并按字面进行匹配):

preg#u match_all(“##si”,
$output[0],$match);

dot
和问号
在正则表达式模式中具有特殊意义。你需要逃避它

  • 匹配任何字符(换行符除外)
  • 量词要尽可能多地在零和一次之间匹配
它应该使用非贪婪的方式

<td><a href="readmail\.html\?id=(.*?)">

示例代码:

$re = "/<td><a href=\\"readmail\\.html\\?id=([^\\"]+)\\">/";
$str = "<td><a href=\"readmail.html?id=xsX321dsa\">Hi</a></td>";

preg_match_all($re, $str, $matches);
$re=“/”;
预匹配全部($re,$str,$MATCHS);

@Unihedron,谢谢。我不知道那件事。
<td><a href="readmail\.html\?id=(.*?)">
<td><a href="readmail\.html\?id=([^"]+)">
$re = "/<td><a href=\\"readmail\\.html\\?id=([^\\"]+)\\">/";
$str = "<td><a href=\"readmail.html?id=xsX321dsa\">Hi</a></td>";

preg_match_all($re, $str, $matches);