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"。