preg_match 并获取匹配表单中输入字段的名称

preg_match and get name of input field in matched form

好的,我有 2 个这样的表格:

$sub = '

Some text....
<form class="form-search" method="post" action="/index.php">
  <div class="form-group">
    <input id="address_box" type="text" class="form-control" name="x" value="" onfocus="this.select()" />
  </div>
<span class="btn btn-s btn-caps"><input type="submit" value="start" /></span>
</form>
Some text....
<form class="form-search" method="post" action="/home.php">
  <div class="form-group">
    <input id="address_box" type="text" class="form-control" name="y" value="" onfocus="this.select()" />
  </div>
<span class="btn btn-s btn-caps"><input type="submit" value="start" /></span>
</form>
Some text....
';

我想:

Preg_match:

START = <form

WHERE action CONTAIN /index.php
EX: action="/index.php" or action="http://whatever.com/index.php"

FIND name="[A-Za-z]{1}"

END = </form>

Then Output the [A-Za-z]{1} Match

现在这是我的代码:

$pat = '/<form.*(?<=action=\")?\/index.php\">.*(?<=name=\")([A-Za-z]{1})(?=\").*?<\/form>/s';
preg_match($pat,$sub,$match);
print_r($match[1]);

这应该是select第一种形式,输出=x​​

但我得到输出 = y(最后一个)

如果我只有 1 种形式,我的正则表达式工作正常,但如果我有 2 种或更多形式,它总是跳过所有并匹配最后一个,这是完全错误的。

请问有什么问题吗?

谢谢。

您可以将正则表达式更改为如下内容:

$pat = '~<form[^>]+action="[^"]*/(?:index.php)"[^>]*>(?!.*<form).*name="([a-zA-Z]{1})".*?</form>~s';
preg_match($pat,$sub,$match);
print_r($match[1]);