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]);
好的,我有 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]);