2016-06-17 115 views
3

试图解析以下元素的值:PHP的preg_match不工作在其他Web应用程序

INPUT TYPE = “隐藏” 名称= “csrf_token” 值= “VUNht8fnmxmJXJIMassWW8SAwWKNJ3SC8POA4FtSqEKhG1rcoB3ZNqcPqa615tPsF_hzW0l4zDjSEHJYMz9Ogw ==”>

围绕元素

区看起来是这样的:

  <input type="hidden" name="redirect" value=""> 
      <input type="hidden" name="invite_code" value=""> 
      <input type="hidden" name="invite" value=""> 
      <input type="hidden" name="country" value=""> 
      <input type="hidden" name="csrf_token" value="325fTt31vp42rbt90gNqBT923_Z04snI5tmhCOAhSzpmL2mr3NBAho1zp6bEirZrLdQna5Ocm6_iC3OYdbBqLg=="> 

      <div> 

用下面的码L国家统计局:

preg_match("/csrf_token. value=.(.+==).>/", $result, $output_array); 

$ output_array为空,其中在http://www.phpliveregex.com/正则表达式是正确的。

我在做什么错?

+1

' “/ csrf_token值=(?+ ==)> /秒。”' –

+0

@WiktorStribiżew似乎并不去工作,也/ s指定点匹配一个新的行,我不希望这一点。 – Keddy1201

+1

在此工作,https://eval.in/590926。也许你的'$ result'不是你所期望的。另外使用一个解析器,你可以拉取属性'value'的值。 – chris85

回答

1

正则表达式的方式

\s+替换文字空间:

preg_match("/csrf_token.\s+value=.(.+==).>/", $result, $output_array); 

此外,你可能想在这里提高了几个其他的事情。几点建议:

  • 而不是.匹配",使用['\"]?(一般较少,避免了随机的东西像csrf_token2匹配)。
  • 而不是.+==,使用[^='"]+=*(相同的结果,但更好的性能,匹配以1或0结尾的令牌= s)。

有了这些建议,您的代码将是:

preg_match("/csrf_token['\"]?\s+value=['\"]?([^='\"]+=*)['\"]?>/", $result, $output_array); 

这里有一个working demo

更好的方法

不要用正则表达式解析HTML。只需使用解析器。

+0

似乎也没有工作,要去与@ chris85关于使用解析器说。 – Keddy1201

2

这里有一个分析器版本:

<?php 
$doc = new DOMDocument(); 
$doc->loadHTML('<input type="hidden" name="csrf_token" value="VUNht8fnmxmJXJIMassWW8SAwWKNJ3SC8POA4FtSqEKhG1rcoB3ZNqcPqa615tPsF_hzW0l4zDjSEHJYMz9Ogw==">'); 
foreach ($doc->getElementsByTagName('input') as $input) { 
    if ($input->getAttribute('name') == 'csrf_token') { 
     echo $input->getAttribute('value'); 
    } 
} 

演示:https://eval.in/590936

5

只是把我的两分钱中,这是一种用DOMDocument XPath查询:

<?php 

$html = <<<EOF 
      <input type="hidden" name="redirect" value=""> 
      <input type="hidden" name="invite_code" value=""> 
      <input type="hidden" name="invite" value=""> 
      <input type="hidden" name="country" value=""> 
      <input type="hidden" name="csrf_token" value="325fTt31vp42rbt90gNqBT923_Z04snI5tmhCOAhSzpmL2mr3NBAho1zp6bEirZrLdQna5Ocm6_iC3OYdbBqLg=="> 
      <div> 
EOF; 

$dom = new DOMDocument(); 
$dom->loadHTML($html); 

$xpath = new DOMXPath($dom); 

$inputs = $xpath->query("//input[@name='csrf_token']/@value"); 
foreach ($inputs as $input) { 
    echo $input->nodeValue; 
    # 325fTt31vp42rbt90gNqBT923_Z04snI5tmhCOAhSzpmL2mr3NBAho1zp6bEirZrLdQna5Ocm6_iC3OYdbBqLg== 
} 

// alternatively, if you're sure there's ALWAYS only ONE element, pick the first one 
echo $xpath->query('//input[@name="csrf_token"]/@value')->item(0)->nodeValue; 
?> 

a demo on ideone.com

2

使用DOM解析器通过'//input[@name="csrf_token"]' XPath获取所需的所有值(即,获取包含name属性的所有input标记与csrf_token值)。

看到example

$html = <<<DATA 
<div> 
<input type="hidden" name="redirect" value=""> 
<input type="hidden" name="invite_code" value=""> 
<input type="hidden" name="invite" value=""> 
<input type="hidden" name="country" value=""> 
<input type="hidden" name="csrf_token" value="325fTt31vp42rbt90gNqBT923_Z04snI5tmhCOAhSzpmL2mr3NBAho1zp6bEirZrLdQna5Ocm6_iC3OYdbBqLg=="> 
</div> 
DATA; 

$dom = new DOMDocument('1.0', 'UTF-8'); 
$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); 

$xpath = new DOMXPath($dom); 
$inputs = $xpath->query('//input[@name="csrf_token"]'); 
$res = array(); 
foreach($inputs as $input) { 
    array_push($res, $input->getAttribute("value")); 
} 
print_r($res); 

输出:

Array 
(
    [0] => 325fTt31vp42rbt90gNqBT923_Z04snI5tmhCOAhSzpmL2mr3NBAho1zp6bEirZrLdQna5Ocm6_iC3OYdbBqLg== 
) 
+0

你可以直接访问它:'echo $ xpath-> query('// input [@ name =“csrf_token”]/@ value') - > item(0) - > nodeValue;'如果总是只有一个** **元素。 – Jan

+0

如果还有更多?我只是展示了一种获得所有这些价值的方法。当然,我们不知道实际的HTML,并且要求不明确。 –

+0

你知道答案,然后循环结果,因为你已经在做的是要走的路:) – Jan

相关问题