0

私の質問は完全に単純です。非常に不規則な次のような文字列があります。

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' アプリケーション: label='Adobe Reader' icon='res/drawable-mdpi/reader_app_android.png' 起動可能なアクティビティ: 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','タッチスクリーンが必要な場合明示的にオプションにしない限り、メインのその他のアクティビティ、その他のサービスでサポートされているスクリーン: '小さい' '通常の' '大きい' 'xlarge' サポートされている任意の密度: '真' ロケール: '--_--' 'da' ' ja' 'de' 'nl' 'pl' 'en' 'ko' 'fr' 'tr' 'cs' 'es' 'it' 'pt' 'ru' 'sv' 'zh_CN' 'zh_TW' 密度: ' 160' '240' '320' ネイティブコード: 'armeabi' 'armeabi-v7a'android.permission.READ_EXTERNAL_STORAGE','requested WRITE_EXTERNAL_STORAGE' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','明示的にオプションにしない限り、タッチスクリーンが必要であると仮定' 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' 密度: '160' '240' '320 ' ネイティブコード: 'armeabi' 'armeabi-v7a'android.permission.READ_EXTERNAL_STORAGE','requested WRITE_EXTERNAL_STORAGE' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','明示的にオプションにしない限り、タッチスクリーンが必要であると仮定' 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' 密度: '160' '240' '320 ' ネイティブコード: 'armeabi' 'armeabi-v7a'要求された WRITE_EXTERNAL_STORAGE' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','明示的にオプションにしない限りタッチ スクリーンが必要であると仮定' 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' 密度: '160' '240' '320' ネイティブコード: 'armeabi' 「armeabi-v7a」要求された WRITE_EXTERNAL_STORAGE' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','明示的にオプションにしない限りタッチ スクリーンが必要であると仮定' 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' 密度: '160' '240' '320' ネイティブコード: 'armeabi' 「armeabi-v7a」uses-implied-feature:'android.hardware.touchscreen','明示的にオプションにしない限り、タッチ スクリーンが必要であると仮定' main other-activities other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports -any-density: 'true' ロケール: '--_--' 'da' 'ja' 'de' 'nl' 'pl' 'en' 'ko' 'fr' 'tr' 'cs' 'es' 'it' 'pt' 'ru' 'sv' 'zh_CN' 'zh_TW' 密度: '160' '240' '320' ネイティブ コード: 'armeabi' 'armeabi-v7a'uses-implied-feature:'android.hardware.touchscreen','明示的にオプションにしない限り、タッチ スクリーンが必要であると仮定' main other-activities other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports -any-density: 'true' ロケール: '--_--' 'da' 'ja' 'de' 'nl' 'pl' 'en' 'ko' 'fr' 'tr' 'cs' 'es' 'it' 'pt' 'ru' 'sv' 'zh_CN' 'zh_TW' 密度: '160' '240' '320' ネイティブ コード: 'armeabi' 'armeabi-v7a'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' 密度: '160' '240' '320' ネイティブコード: 'armeabi' 'armeabi -v7a'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' 密度: '160' '240' '320' ネイティブコード: 'armeabi' 'armeabi -v7a''320' ネイティブ コード: 'armeabi' 'armeabi-v7a''320' ネイティブ コード: 'armeabi' 'armeabi-v7a'

versionCodePHPでこの文字列から何らかの値 (たとえば の値) を解析することは可能ですか?

4

2 に答える 2

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);

上記の出力: 77969

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

上記の出力: Adob​​e Reader

試してみてください: PHP をオンラインで実行する

関数を疑似的に説明するには:

  • 渡された文字列で$keyと 1 文字 (' )が見つかった位置の後に文字列を作成します。
  • 一時文字列の先頭から最初に出現する'までの文字列を返します。
于 2013-08-01T22:20:46.917 に答える
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.

試してみる。

于 2013-08-01T21:56:12.617 に答える