【问题标题】:What's the right pattern for this hidden input这个隐藏输入的正确模式是什么
【发布时间】:2013-06-10 11:54:54
【问题描述】:

我有 curl_exec 返回的这个字段:

<input name="NUMBER_R" type="hidden" value="1500000">

150000是一个随机数,可能会改变,其他都是常数

我试过了:

preg_match ('/<input name="NUMBER_R" type="hidden" value="([^"]*)" \/>/', $result, $number)

还有:

preg_match ('/<input name=\'NUMBER_R\' type=\'hidden\' value=\'(\\d+)\'>/ims', $result, $number)

但没有运气......

这里是完整的代码:

$result=curl_exec($cid);
curl_close($cid);
$number = array();
if (preg_match ('REGEX', $result, $number))
  {
    echo $number[1];
  }

编辑 1: 抱歉,我在 echo $number[1] 中忘记了 [1]; 1500000 也是一个随机数,可能会发生变化

【问题讨论】:

  • 在第一次尝试中,您强制使用自关闭标签,而返回的值实际上不是自关闭的。此外,REGEX'ing 元素通常不是一个很好的举措。为什么不将其放入 DOMDocument 并从中读取值?
  • $number 是一个数组,你应该使用print_r 而不是echo
  • @Utkanos 谢谢你确实有效,不幸的是我不能使用 DOM 出于某种原因,只是另一个问题,如果我总是得到一个数字,值 =(\\d+)\ 是否可以?如果它总是一个数字,什么更好用?我希望你回答而不是评论,所以我可以接受它
  • 我没有回答,因为我没想到自动关闭的东西会成为你的终极问题。是的,\d 非常适合匹配数字 - 这就是它的用途。唯一要记住的是您的+ 修饰符将要求至少有一个数字。如果有可能根本没有值,但您仍希望模式匹配,请使用 *,它强制为 0 或更多。

标签: php regex curl


【解决方案1】:

说明

这个正则表达式会以任意顺序查找具有name="number_r"type="hidden" 属性的输入标签。然后它将提取属性value 及其相关值。它确实要求值文本是所有数字

&lt;input\b\s+(?=[^&gt;]*name=(["'])number_r\1)(?=[^&gt;]*type=(["'])hidden\2)[^&gt;]*value=(["'])(\d+)\3[^&gt;]*&gt;

  • &lt;input\b\s+ 使用左括号和标签名称,确保有分词和空格
  • (?=[^&gt;]*name=(["'])number_r\1) 向前看,以确保此标签包含正确的 name 属性
  • (?=[^&gt;]*type=(["'])hidden\2) 向前看,以确保此标签还包含 type 属性
  • [^&gt;]* 向前移动光标,直到找到
  • value=标签
  • (["'])捕获打开的qoute
  • (\d+) 捕获子字符串并要求它是所有数字
  • \3 匹配正确的关闭引号。这可以省略,因为您已经收到了所需的子字符串。
  • [^&gt;]*&gt; 匹配标签中的其余字符。这可以省略,因为您已经收到了所需的子字符串。

Group 0 获取整个输入标签

  1. 名称的打开引号被反向引用以确保捕获正确的关闭引号
  2. 类型的打开引号,它被反向引用以确保捕获正确的关闭引号
  3. 值的开盘报价被反向引用以确保捕获正确的收盘报价
  4. value 属性中的值

PHP 代码示例:

<?php
$sourcestring="<input name="NUMBER_R" type="hidden" value="1500000">";
preg_match('/<input\b\s+(?=[^>]*name=(["\'])number_r\1)(?=[^>]*type=(["\'])hidden\2)[^>]*value=(["\'])(\d+)\3[^>]*>/im',$sourcestring,$matches);
echo "<pre>".print_r($matches,true);
?>

$matches Array:
(
    [0] => <input name="NUMBER_R" type="hidden" value="1500000">
    [1] => "
    [2] => "
    [3] => "
    [4] => 1500000
)

【讨论】:

  • 哇,你是谁,这是我在 stackoverflow 上得到的最佳答案,非常感谢
【解决方案2】:

尝试使用 DOM 和 Xpath 来获得它。

$xml = new DomDocument;
$xml->loadXml('<input name="NUMBER_R" type="hidden" value="1500000" />');
$xpath = new DomXpath($xml);
// traverse all results
foreach ($xpath->query('//input[@name="NUMBER_R"]') as $rowNode) {
   var_dump($rowNode->getAttribute('value'));
}

测试:http://codepad.viper-7.com/8dwu9f

【讨论】:

  • 非常感谢,但不幸的是我不能使用 DOM,我只需要一个带有随机数值的隐藏字段的模式
猜你喜欢
  • 2010-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-01
  • 2014-05-16
相关资源
最近更新 更多