0

その構造でメソッドをアップロードするオプションを解析したい:

<script>
$(function() {
  $("#file_upload_1").uploadify({
    uploader : '/uploadify/uploadify.php',
  });
});
</script>

次を使用して、スクリプトタグ間のすべてを抽出できます。

$matches = array(); reg_match('/.*<script>(.*)<script>/s', $s, $matches);

しかし、さらに移動する方法がわかりません。「uploadify({」(キーワードであるため) の前、および「});」の最初の出現の後、$matches[1] 内のすべてを削除する必要があります。

4

3 に答える 3

0

オプション、つまり JS オブジェクトが本当に必要なので、そのようなものをネイティブに解析するためのデススター サイズのオーバーキル ソリューションを次に示します。ここでのアイデアは、必要な部分を抽出し、JS の { } JSON オブジェクトの間に格納してから、PHP のjson_decodeを使用して使用可能な構造に評価することです。このコードでは、HTML フラグメントを $variable0 に格納しました。

// expression broken down for readability
$frag = array(
    "/<script>",
    ".*?",             # whitespace
    "uploadify\(",
        "(.*?)",       # our desired match
    "\);",             # closest )
    "(.*)",            # more whitespace we don't want
    "<\/script>/s"
);

// flatten expression into match string
$expr = implode("", $frag );

したがって、この時点で $expr は/<script>.*?uploadify\((.*?)\);(.*)<\/script>/s

$m = preg_match( $expr, $variable0, $r );

ここで、$r は配列である必要があり、その $r[1] にはその "{... }" スニペットが含まれます。これはjson_decodeで評価できますが、文字列は json_decode で使用するには形式が正しくありません。1 つには、javascript でキーを引用符で囲む必要があります (つまり、uploader: '' は 'uploader': '' にする必要があります)。文字通り、$r[1] は次のようになります。

{
    uploader : '/uploadify/uploadify.php',
  }

別の人が、ここで適用できるクリーニング機能を思い付きました。

// fix thanks to http://stackoverflow.com/a/14075951/415324
function fix_json( $a ) {
    $a = preg_replace('/(,|\{)[ \t\n]*(\w+)[ ]*:[ ]*/','$1"$2":',$a);
    $a = preg_replace(
      '/":\'?([^\[\]\{\}]*?)\'?[ \n\t]*(,"|\}$|\]$|\}\]|\]\}|\}|\])/','":"$1"$2',
    $a);

    return( $a );
}

// $r[1] will contain innards of uploadify(), which is JSON
$json = fix_json( $r[1] );

これにより、$json が PHP がネイティブに解析できるものに変わります。$json は次のようになります。

{"uploader":"/uploadify/uploadify.php',"}

末尾にコンマがあることに注意してください。これは、抽出している元の HTML の JavaScript エラーであり、サイトで修正する必要があります。詳細については、以下をご覧ください。

$options = json_decode( $json );

この時点で、PHP で使用できるオブジェクトができました。

var_dump( $options );

object(stdClass)#2 (1) {
  ["uploader"]=>
  string(24) "/uploadify/uploadify.php"
}

したがって、遭遇した追加オプションに簡単にアクセスできます。echo $options->uploader;

: 元の HTML には問題があります --- 一部のブラウザーでは JavaScript の解析を中断する末尾のコンマが含まれています。FireFox はそれをいくらか緩和すると思いますが、確かに IE ではありません。JS を修正するには、オプション オブジェクトの末尾のコンマを削除します。

$("#file_upload_1").uploadify({
  uploader : '/uploadify/uploadify.php'
});
于 2013-04-28T16:58:26.467 に答える