オプション、つまり 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'
});