Regex 正则表达式中的问号未按预期工作

Regex 正则表达式中的问号未按预期工作,regex,Regex,我想匹配>之后的所有文本,并可以选择匹配同一行上的链接: preg_match('#(href="([^"]*))?.*>(.*)#', '<a href="world.html">Hello', $m); print_r($m); 实际结果: [2] => [3] => Hello 如果我去掉问号,它会起作用,但是链接显然不再是可选的 为什么会发生这种情况以及如何修复它?在处理带有*的可选子模式时,必须非常小心 关键是可选模式之后的*几乎总是“接受”可选子模

我想匹配
>
之后的所有文本,并可以选择匹配同一行上的链接:

preg_match('#(href="([^"]*))?.*>(.*)#', '<a href="world.html">Hello', $m);
print_r($m);
实际结果:

[2] => 
[3] => Hello
如果我去掉问号,它会起作用,但是链接显然不再是可选的


为什么会发生这种情况以及如何修复它?

在处理带有
*
的可选子模式时,必须非常小心


关键是可选模式之后的
*
几乎总是“接受”可选子模式值。您的正则表达式适用于类似的字符串。但如果前面有其他符号,则不会

查看:当您反对具有
(?:(?!href=“)[^>])*
(不匹配
href=“
序列)的
正则表达式时,或者将任务拆分为两个操作(是的,这是最好的):

1) 抓取所有链接

2) 检查可选值。

以及您希望支持的其他字符串格式是什么<代码>你好
?试试啊!我会因为那些复杂的环视模式而变得雪盲。如果这是最简单的方法,我将把代码分成两个简单的检查。请解释为什么它必须如此复杂。重点是可选模式之后的
*
几乎总是“接受”可选子模式值。您的正则表达式适用于类似于Hello的字符串。但如果前面有其他符号,则不会,因为可选模式匹配空字符串,即在每个不匹配符号之前。我想您想写“查找最后一个>”。是的。当然那纯粹是打字错误。
[2] => world.html
[3] => Hello
[2] => 
[3] => Hello