2013-03-06 39 views
0

我的問題是完全簡單,我有類似以下這是相當不規則的字符串:解析來自蓬亂字符串的屬性

包:名稱=「com.adobe.reader」的versionCode =「77969」 versionName = '10.6.1'application-label:'Adobe Reader' application-label-da:'Adobe Reader'application-label-ja:'Adobe Reader'application-label-de:'Adobe Reader' application -label-nl:'Adobe Reader'application-label-pl:'Adobe Reader'application-label-en:'Adobe Reader' application-label-ko:'Adobe Reader'application-label-fr:'Adobe Reader'application-label-tr:'Adobe Reader' application-label-cs:'Adobe Reader'application-label-es:'Adobe Reader'application-label-it:'Adobe Reader' application-label- pt:'Adobe Reader'application-label-ru:'Adobe Reader'application-label-sv:'Adobe Reader' application-label-zh_CN:'Adobe Reader'application-label-zh_TW:'Adobe Reader' application-icon-160:'res/drawable-mdpi/reader_app_android.png' application-icon-240:'res/drawable-hdpi/reader_app_android.png' application-icon-320:'res/drawable-xhdpi/reader_app_android .png' application:label ='Adobe Reader' icon ='res/drawable-mdpi/reader_app_android.png'launchable-activi ty: name ='com.adobe.reader.AdobeReader'label =''icon =''sdkVersion:'8' uses-permission:'com.adobe.reader.provider.permission.READ' uses-permission: 'android.permission.INTERNET對' 使用許可權: 'android.permission.WRITE_EXTERNAL_STORAGE' 使用許可權: 'android.permission.ACCESS_NETWORK_STATE' 使用許可權: 'android.permission.READ_EXTERNAL_STORAGE' 使用-隱含權限: 'android.permission.READ_EXTERNAL_STORAGE','請求 WRITE_EXTERNAL_STORAGE'使用特徵:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','假設你需要一個觸摸屏,除非明確提出可選'主要 其他活動其他r-services supports-screens:'small''normal' 'large''xlarge'supports-any-density:'true'locales:'--_--''da' 'ja''de''nl '''''''''''''''''''''''''''''''''''''012'''''''''''''''''' 320' 本機代碼: 'armeabi' 'armeabi-V7A'

是否有可能從解析PHP中的這個字符串(例如的versionCode值)的一些價值?

+0

第一次出現的正則表達式會像'preg_match'或'explode'是一個選擇的字符串? – 2013-08-01 21:47:37

回答

1

如果你想這樣做在PHP中,你可以做這樣的事情:

function find_var($key, $str) { 
    $temp = substr($str, (strpos($str, $key)+(strlen($key)+1))); 
    return substr($temp, 0, strpos($temp, "'")); 
} 

$val = "package: name='com.adobe.reader' versionCode='77969' versionName='10.6.1' application-label:'Adobe Reader' application-label-da:'Adobe Reader' application-label-ja:'Adobe Reader' application-label-de:'Adobe Reader' application-label-nl:'Adobe Reader' application-label-pl:'Adobe Reader' application-label-en:'Adobe Reader' application-label-ko:'Adobe Reader' application-label-fr:'Adobe Reader' application-label-tr:'Adobe Reader' application-label-cs:'Adobe Reader' application-label-es:'Adobe Reader' application-label-it:'Adobe Reader' application-label-pt:'Adobe Reader' application-label-ru:'Adobe Reader' application-label-sv:'Adobe Reader' application-label-zh_CN:'Adobe Reader' application-label-zh_TW:'Adobe Reader' application-icon-160:'res/drawable-mdpi/reader_app_android.png' application-icon-240:'res/drawable-hdpi/reader_app_android.png' application-icon-320:'res/drawable-xhdpi/reader_app_android.png' application: label='Adobe Reader' icon='res/drawable-mdpi/reader_app_android.png' launchable-activity: name='com.adobe.reader.AdobeReader' label='' icon='' sdkVersion:'8' uses-permission:'com.adobe.reader.provider.permission.READ' uses-permission:'android.permission.INTERNET' uses-permission:'android.permission.WRITE_EXTERNAL_STORAGE' uses-permission:'android.permission.ACCESS_NETWORK_STATE' uses-permission:'android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission:'android.permission.READ_EXTERNAL_STORAGE','requested WRITE_EXTERNAL_STORAGE' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' main other-activities other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'da' 'ja' 'de' 'nl' 'pl' 'en' 'ko' 'fr' 'tr' 'cs' 'es' 'it' 'pt' 'ru' 'sv' 'zh_CN' 'zh_TW' densities: '160' '240' '320' native-code: 'armeabi' 'armeabi-v7a'"; 
echo find_var('versionCode=', $val); 

以上輸出:

echo find_var('application-label:', $val); 

以上輸出:ADOBE READER

試試看:Run PHP Online

爲了解釋這一功能在僞:

  • 位置$關鍵加1個字符(以下簡稱「)傳遞的字符串中發現後創建的字符串。
  • 返回從臨時字符串的開頭開始直到
+0

提問者寫道:「我有一個像下面那樣很不規則的字符串。您可能會遇到此解決方案的問題。使用正則表達式與例如preg_match(請參閱我答案中的示例)允許更廣泛的匹配(例如空格,=,:和'符號)。 – 2013-08-02 11:53:47

+0

BTW:根據此解決方案中函數調用的數量,它甚至比preg_match解決方案還要慢。 – 2013-08-02 11:54:36

1

您可以使用preg_match。

例如:

<?php 
$str = '...'; 

function parseStr($key, $str) 
{ 
    $regex = '/(?:'.$key.'[=:]{1})\s?\'?([^\'\s]+)\'?\s/si'; 
    $str = rtrim($str).' '; 

    return preg_match($regex, $str, $matches) ? $matches[1] : false; 
} 

var_dump(parseStr('versionCode', $str)); // Use var_dump for debugging/testing, 
             // put the output in a var otherwise. 

下面是它做什麼:

Regex '/(?:'.$key.'\=)\'?([^\'\s]+)\'?\s/si': 

    (?:    => excludes the key from the match 
    '.$key.'[=:]{1}) => finds the key in the string 
      [=:]{1} => either = or : comes after the key 
    \s?\'?   => a space or ' is optional at this point 
    ([^\'\s]+)  => matches the desired value 
    \'?\s    => again, ' is optional but a space is required 
    /si    => s = single-line mode and i = case insensitive 

rtrim($str) strips the last space (if any) of the string and .' ' adds it again. 
This is done, because of the regex "\'?\s" part. 

return $pr ? $match[1] : false; means, return the value or false if no match. 

試試看吧。

+0

它不工作! – iSun 2013-08-02 11:03:56

+0

它確實有效...更新了答案。 – 2013-08-02 11:47:06