preg_match并以匹配的形式获取输入字段的名称

时间:2015-03-16 08:37:17

标签: php forms preg-match

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

$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]);

这应该选择第一个表格并输出= x

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

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

有什么问题?

感谢。

1 个答案:

答案 0 :(得分:0)

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

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