用于从html文件中检索jquery函数的正则表达式无法在PHP服务器上运行

I am using regex code to find jquery functions used inside any html file. The php code is:

<?php
$file=<<<FOO
<html>
<body>
    <div class="content">
        <div class="main-content">
            <ul class="show-sport">
                <li class="active"><img src="assets/img/show-1.png"/></li>
                <li><img src="assets/img/show-2.png"/></li>
                <li><img src="assets/img/show-3.png"/></li>
            </ul>
        </div>
    <script>
        $('.show-sport').fadeSlider({speed:5000});
        $('.modal-switch').modal();
    </script>
    </div>
</body>
</html>
FOO;
preg_match_all("/\$\('(.*)'\).(.*)\((.*)\)/", $file, $jQuery_func);
var_dump($jQuery_func);
?>

The $file will store file contents later on. This is output I am getting:

array (size=4)
  0 => 
    array (size=0)
      empty
  1 => 
    array (size=0)
      empty
  2 => 
    array (size=0)
      empty
  3 => 
    array (size=0)
      empty

But when I am testing it on any other online php regex tester, it is giving:

Array
(
    [0] => Array
        (
            [0] => $('.show-sport').fadeSlider({speed:5000})
            [1] => $('.modal-switch').modal()
        )

    [1] => Array
        (
            [0] => .show-sport
            [1] => .modal-switch
        )

    [2] => Array
        (
            [0] => fadeSlider
            [1] => modal
        )

    [3] => Array
        (
            [0] => {speed:5000}
            [1] => 
        )
)

You can see the results here http://www.phpliveregex.com/p/9fo, click preg_match_all tab.

PHP version: 5.4.16 | Apache Version: 2.4.4

I have hit my head many times but can't set it working on localhost. Is there any PHP extension that needs to be enabled to get it working?

dongsigan2636
dongsigan2636 很好,请记住,随着项目的发展,特定需求会发生变化,乔姆斯基的工作仍然受到最高的关注。如果你设法证明他是错的,也可以将你的调查结果发送给麻省理工学院,因为他们可能想要给你一笔补助金
5 年多之前 回复
donglusou3335
donglusou3335 你是对的...,但这个正则表达式满足了我的需要。
5 年多之前 回复
duanpanbo9476
duanpanbo9476 我正在按照我的具体需要创建它以用于我的项目...,但仍然是一个[竖起大拇指]给出一个更强硬的目标。我认为可以通过使用递归函数调用来完成,如果找到回调,然后使用相同的正则表达式来匹配它,直到我们找不到回调。但是,嵌套级别可能变得复杂,无法读取和解析。但这不是我的问题......
5 年多之前 回复
dpfwhb7470
dpfwhb7470 是的......我只是说你可能想重新考虑你的方法:jQ函数调用往往是嵌套的,这对正则表达式来说很难处理(如果不是不可能的话)。特别是考虑到JS是一种函数式语言,其中函数可以返回,分配给变量并作为参数传递。处理简单的jQ循环时,你的模式失败:$.each($('。elems'),function(){console.log($this);});由于JS不是常规语言,因此无法使用正则表达式进行解析(请检查Chomsky层次结构)
5 年多之前 回复
douhuxi4145
douhuxi4145 所以你想匹配jQ的选择器,方法和它们的参数?好运的代码如$('#foo')。on('click','。elem',function(){$(this).on('click',function(){}...);});:处理编程语言由词法分析器和解析器完成。正则表达式无法胜任工作
5 年多之前 回复

1个回答



刚刚进行了一些调试</ p>

你的php中有不同的正则表达式而不是你的在线链接页面 : - )
(或者我不知道为什么:-)它必须是不同的)</ p>

所以只需改变你的正则表达式模式:</ p>

  preg_match_all(“/\$('(.*)').(.*)((.*))/”,$ file,$ jQuery_func); 
</ code> < / PRE>

到</ p>

 <代码> preg_match_all(“/ \ $ \( '(。*)' \)。(。*)\((  。*)\)/“,$ file,$ jQuery_func); 
</ code> </ pre>

或</ p>

  $ pattern =  “/\\('(。*)'\)。(。*)\((。*)\)/”;; n var_dump($ pattern); 
preg_match_all($ pattern,$ file,$ jQuery_func);
</ code> </ pre>

看看为什么我们应该两次逃避美元符号</ p>

它有效: - )</ p> \ n </ div>

展开原文

原文

just made some debug

you have different regex in your php than on your online link page :-) (or I don't know why :-) it must be different)

so just change your regex pattern from:

preg_match_all("/\$\('(.*)'\).(.*)\((.*)\)/", $file, $jQuery_func);

to

preg_match_all("/\\$\('(.*)'\).(.*)\((.*)\)/", $file, $jQuery_func);

or

$pattern = "/\\$\('(.*)'\).(.*)\((.*)\)/";
                var_dump($pattern);
                    preg_match_all($pattern, $file, $jQuery_func);

to see why we should escape dollar sign twice

it works :-)

dounieyan2036
dounieyan2036 谢谢,这是一个完美的感觉。
5 年多之前 回复
dqdfpmmi022763
dqdfpmmi022763 这是关于在单引号和/或双引号内转义特殊字符。 所以,如果你改变了sinax $ pattern =“/\\ $('(。*)')。(。*)/(。*)/)”; 从单引号开始你可以得到这样的东西:$ pattern ='/\$(\'(.*)\').(.*)((.*))/'; 因为现在你必须逃避不是美元符号,而是在你的字符串中单引号:-)
5 年多之前 回复
douyan8070
douyan8070 它的工作,但仍然不明白为什么它从字符串中删除一个“\”,为什么我需要双“\\”。 正如在两个php正则表达式“phpliveregex.com”和js正则表达式“www.regexr.com”中单个“\”工作正常。
5 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问