0

我想解析该结构中uploadify方法的选项:

<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

由于 php 提供了 preg_match,您似乎在正则表达式函数中错过了 p。尽管如此,您可以使用以下正则表达式来匹配 uploadify 方法;

preg_match('/<script>.*?(uploadify\({.*?}\);).*<\/script>/s', $s, $matches);
于 2013-04-28T16:05:04.303 回答
0

您的模式中似乎缺少一个转义的斜线:

/.*<script>(.*)<\/script>/s

但是,更改分隔符会更容易:

~.*<script>(.*)</script>~s

请注意,这将使您获得<script>输入中的最后一对(.*将尽可能多地消耗,将两个标签尽可能向后推)。如果这就是你想要的,那就够公平了。

无论如何,最好script使用 DOM 解析器来获取标签的内容。它更健壮,更具可读性等等。以下是使用 PHP 执行此操作的选项的概述。

现在你的实际问题。同样,JavaScript 或 JSON 解析器可能会有所帮助,但使用正则表达式,您可以使用非贪婪重复,以确保您的匹配只上升到第一个});

/uplodify[(][{](.*?)[}][)];/s

这种方法的主要问题是它});可能发生在字符串或注释中,甚至可能是嵌套匿名函数的结尾。尽管 PCRE 在正则表达式中提供了递归(?R)构造,但尝试使用它来解析 JavaScript 势必会融化您的大脑(以及将来任何试图理解代码的人)。这就是为什么(对于一个健壮的解决方案)这应该使用某种 JavaScript 解析器来解决。

您甚至可能会更好,只需uploadify逐个字符地查找并遍历字符串的其余部分,计算 JavaScript 具有的不同类型的嵌套级别,以确保您正在寻找正确的});.

于 2013-04-28T15:40:09.067 回答
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。一方面,键必须用引号括起来(即:上传者:''应该是'上传者':'')在javascript中。从字面上看,$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 回答