【问题标题】:PHP preg_match specific field valuePHP preg_match 特定字段值
【发布时间】:2015-06-11 20:32:14
【问题描述】:

我想获取不断改变其值的字段的 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);

【问题讨论】:

  • 你为什么不用DOM?
  • 您能否修改代码以将onclick= 或onchange= 之类的事件添加到这些输入?您可以在表单中添加另一个字段,例如隐藏输入吗?
  • 这是一个外部站点。无法更改创建表单的代码。
  • 其他字段会带有数字名称,还是只有第一个?
  • 你可以尝试像foreach $_POST as $key =&gt; $value这样的帖子数据迭代吗?由于您仅声明第一个字段具有数字名称,因此只需检查 $key 是否为数字。

标签: php regex preg-match


【解决方案1】:

试试这个:

preg_match('/\bid\s*=\s*"(\d{5})"/', $html, $fieldId);
  • 单词边界的转义序列是\b,而不是\d。
  • 没有理由在 \b 周围使用捕获组,因为它是零长度匹配。
  • ID 两边的双引号不匹配。
  • 您可以使用\d 代替[0-9] 来匹配数字。
  • ID 后面没有\d+,我不知道你的正则表达式有什么用。

【讨论】:

    【解决方案2】:

    您似乎只是省略了引号。否则,您的正则表达式是正确的。您可能需要在等号周围放置 \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将它们中的每一个提取到带有标签名称的字符串中。

    【讨论】:

      【解决方案3】:

      您可以使用蛮力。下一个文件 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”。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多