PHP preg_match 具体字段值
PHP preg_match specific field value
我想获取不断更改其值的字段的 ID 或名称。
示例:
我的表单中有这些字段:
<input type="text" id="94245" name="94245" value="">
<input type="text" id="name" name="name" value="">
<input type="text" id="status" name="status" value="">
而且我想获取第一个字段的ID或名称,但它一直在变化,例如:
<input type="text" id="52644" name="52644" value="">
<input type="text" id="44231" name="44231" value="">
<input type="text" id="94831" name="94831" value="">
模式是始终是 5 个数值。
我试过了,但没有成功:
preg_match('/(\d)id=\s*([0-9]{5})\s*(\d+)/', $html, $fieldId);
您似乎只是省略了引号。否则,您的正则表达式是正确的。您可能希望将 \s 放在等号周围,以防万一:
if (preg_match('/\s*name\s*=\s*"([0-9]{5})"/', $html, $gregs)) {
$fieldId = $gregs[1];
}
如您所见,我还将搜索属性从 id
更改为 name
。在您的示例中,它们是相等的,但发送的值将是 name
.
指定的值
如果这个名字重写反抓取策略被应用到更多的字段,你可以先通过查找“]*>”(即使you shouldn't parse HTML with regex)得到一个字段数组,然后使用array_map
将它们中的每一个提取到带有标签名称的字符串中。
试试这个:
preg_match('/\bid\s*=\s*"(\d{5})"/', $html, $fieldId);
- 单词边界的转义序列是
\b
,而不是 \d
。
- 没有理由在
\b
周围使用捕获组,因为它是零长度匹配。
- 您没有匹配 ID 两边的双引号。
- 您可以使用
\d
而不是 [0-9]
来匹配数字。
- ID 后没有
\d+
,我不知道你的正则表达式中那是什么意思。
你可以使用蛮力。下一个文件 numeric_name1.php 发送表单,其中第一个字段具有数字名称。第二个文件 numeric_name2.php 遍历所有数字,直到找到 $_POST 中存在的数字。他们在这里:
numeric_name1.php
<html>
<body>
<form method="post" action="numeric_name2.php">
<input type="text" id="94245" name="94245" value="" />
<input type="text" id="name" name="name" value="" />
<input type="text" id="status" name="status" value="" />
<input type="submit" value="Submit this form"/>
</form>
</body>
</html>
numeric_name2.php
<?php
for ( $i = 0; $i < 99999; $i++ ) // TRY ALL NUMBERS WITH 5 DIGITS.
{ $num = sprintf( "%05d",$i ); // EXPAND $I TO A STRING WITH 5 DIGITS.
if ( isSet( $_POST[ $num ] ) ) // IF THIS NUMERIC NAME EXISTS...
{ echo "The name is = " . $num;
break; // STOP WHEN FOUND.
}
}
?>
要测试此代码,请创建两个文本文件,使用给定的名称,复制粘贴代码,打开浏览器并 运行 "localhost/numeric_name1.php"。
我想获取不断更改其值的字段的 ID 或名称。
示例:
我的表单中有这些字段:
<input type="text" id="94245" name="94245" value="">
<input type="text" id="name" name="name" value="">
<input type="text" id="status" name="status" value="">
而且我想获取第一个字段的ID或名称,但它一直在变化,例如:
<input type="text" id="52644" name="52644" value="">
<input type="text" id="44231" name="44231" value="">
<input type="text" id="94831" name="94831" value="">
模式是始终是 5 个数值。
我试过了,但没有成功:
preg_match('/(\d)id=\s*([0-9]{5})\s*(\d+)/', $html, $fieldId);
您似乎只是省略了引号。否则,您的正则表达式是正确的。您可能希望将 \s 放在等号周围,以防万一:
if (preg_match('/\s*name\s*=\s*"([0-9]{5})"/', $html, $gregs)) {
$fieldId = $gregs[1];
}
如您所见,我还将搜索属性从 id
更改为 name
。在您的示例中,它们是相等的,但发送的值将是 name
.
如果这个名字重写反抓取策略被应用到更多的字段,你可以先通过查找“]*>”(即使you shouldn't parse HTML with regex)得到一个字段数组,然后使用array_map
将它们中的每一个提取到带有标签名称的字符串中。
试试这个:
preg_match('/\bid\s*=\s*"(\d{5})"/', $html, $fieldId);
- 单词边界的转义序列是
\b
,而不是\d
。 - 没有理由在
\b
周围使用捕获组,因为它是零长度匹配。 - 您没有匹配 ID 两边的双引号。
- 您可以使用
\d
而不是[0-9]
来匹配数字。 - ID 后没有
\d+
,我不知道你的正则表达式中那是什么意思。
你可以使用蛮力。下一个文件 numeric_name1.php 发送表单,其中第一个字段具有数字名称。第二个文件 numeric_name2.php 遍历所有数字,直到找到 $_POST 中存在的数字。他们在这里:
numeric_name1.php
<html>
<body>
<form method="post" action="numeric_name2.php">
<input type="text" id="94245" name="94245" value="" />
<input type="text" id="name" name="name" value="" />
<input type="text" id="status" name="status" value="" />
<input type="submit" value="Submit this form"/>
</form>
</body>
</html>
numeric_name2.php
<?php
for ( $i = 0; $i < 99999; $i++ ) // TRY ALL NUMBERS WITH 5 DIGITS.
{ $num = sprintf( "%05d",$i ); // EXPAND $I TO A STRING WITH 5 DIGITS.
if ( isSet( $_POST[ $num ] ) ) // IF THIS NUMERIC NAME EXISTS...
{ echo "The name is = " . $num;
break; // STOP WHEN FOUND.
}
}
?>
要测试此代码,请创建两个文本文件,使用给定的名称,复制粘贴代码,打开浏览器并 运行 "localhost/numeric_name1.php"。