2015-09-13 187 views
-1

我想搜索shell腳本中定義的變量。PHP preg_match返回字符串的字符數而不是預期的結果

<?php 
$code = ' 
#!/bin/bash 
foo = "Hello world!" 
bar="123" 
echo -e "The value of foo is $foo\n" 
echo -e "The value of bar is $bar" 
'; 
$var_pattern = "/(^[a-zA-Z0-9_]+[\= ]+([\"\']?)+(.)+([\"\']?))*$/"; 
preg_match($var_pattern, $code, $matches, PREG_OFFSET_CAPTURE); 
print_r($matches); 

有在上面的例子被定義兩個變量(FOO &巴)。我使用regex101.com檢查過的正則表達式。

我得到的結果是...

Array 
(
    [0] => Array 
     (
      [0] => 
      [1] => 121 
     ) 

) 

121似乎是在代碼中的字符數。我期待的結果是更像...

Array 
(
    [0] => Array 
     (
      [0] => 
      [1] => foo = "Hello world!" 
     ), 
    [1] => Array 
     (
      [0] => 
      [1] => bar="123" 
     ) 
) 

或類似的!我究竟做錯了什麼?

+1

那就是'PREG_OFFSET_CAPTURE'一樣。它包括比賽位置。你不是在找'preg_match_all'嗎? – mario

+0

@mario我嘗試了preg_match_all並從中得到了類似的結果(即字符數) – Ally

+0

首先,您需要將m標誌添加到您的模式,否則^和$匹配字符串的開始和結尾而不是其中的換行符。 –

回答

0

你原來的做法有一對夫婦的疾苦:

  • 失蹤的/m多標誌,所以^$沒有錨線。
  • (…)*捕獲組完全optionalized *
  • 雖然(.)+將捕獲只是一個所含值的信。
  • PREG_OFFSET_CAPTURE是多餘的,除非你真的想要匹配位置。

由於這或多或少是一個經典的INI格式,你可以簡單地使用:

     key     value  multiline 
         ↑      ↑    ↑ 
preg_match_all("/^ (\w+) \s*=\s* [\"\']? (.+?) [\"\']? $/mix", $str, $m); 
          ↓  ↓    ↓ 
          equal quote   quote 

之後,你甚至可以從$m比賽陣列重建一個關聯鍵→值陣列,與=array_combine($m[1], $m[2])

+0

經過這麼多年後,我以爲自己已經差不多了,終於把我的腦袋繞過了正則表達式。你已經證明理論是錯誤的:(然而,你的修正正則表達式的工作(迄今爲止的測試)和你的解釋是非常有用的。謝謝:) – Ally

0

嘗試用以下模式:

/([a-zA-Z][a-zA-Z0-9_]*)\s*=\s*(|['"])(.+)\2/g 

工作例如@regex101

相關問題