2016-06-17 42 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

相關問題