我试图从输入name =“something”的大字符串输出中获取所有值;
我的curl函数以String格式返回响应(事实上它是一个完整的html页面)。大多数信息都没用,但是在这个字符串中我有我想要的信息
<input name="queueID" value="4795" type="checkBox" checked>aaaa
<br>
<input name="queueID" value="4799" type="checkBox" checked>bbbb
<br>
<input name="queueID" value="4796" type="checkBox" checked>cccc
<br>
<input name="queueID" value="4794" type="checkBox" checked>dddd
<br>
注意:queueID的数量是动态的,所以我可以有2个队列或10个队列。并且每个队列上的数字可以不同,按顺序不是必需的。输入名称是ALWAYS queueID。
使用REGEX执行此操作时,我真的不知道该怎么做,如果有人知道我会欣赏正则表达式解决方案的答案。
我尝试过更多静态的方式,比如
$needle = array (' ' ' ' ' ' ' ' );
$pattern = '' . implode('|', array_map('preg_quote', $needle)) . '/i';
foreach($file_list as $file) {
if(preg_match($pattern, $file)) {
}
}
然而,只有当我知道我有多少队列以及这个队列的数字时,这才有效。任何人都能为这个问题提出一个合适的解决方案吗
答案 0 :(得分:1)
preg_match_all('/(?<=^<input name="queueID" value=")\d+/mi', $str, $values);
答案 1 :(得分:1)
关于以下PCRE正则表达式的preg_match_all怎么样?
preg_match_all('#<input.*?>(.*?)\n<br>#', $html, $matches);
答案 2 :(得分:1)
如果使用正则表达式,则name-value
的排序发生变化时,您将面临问题。例如,这个与您的输入略有不同:
value="4794" name="queueID"
您可以尝试使用首先检查(?=[^>]*name="queueID")
标记是否包含<input
的前瞻性正则表达式name="queueID"
)。之后它会解析Value。
$input = '<input name="queueID" value="123" type="checkBox" checked>aaaa
<input name="queueID" value="456" type="checkBox" checked>bbbb
<input name="xqueueID" value="789" type="checkBox" checked>bbbb
<input name="queueID" value="101112" type="checkBox" checked>cccc
<input value="131415" name="queueID" type="checkBox" checked>dddd';
preg_match_all('/<input\b(?=[^>]*name="queueID")[^>]*\bvalue="([^"]+)"/i', $input, $match);
print_r($match[1]);
输出:
[0] => 123
[1] => 456
[2] => 101112
[3] => 131415