preg_match_all正则表达式问题

时间:2013-05-28 19:56:22

标签: php regex

我正在使用preg_match_all,尝试匹配:

[<? or <?php]
[any amount of space here, at least one, may be newline]
[legendcool]
[any amount of space]
[(] return whatever is in here [)]
[any amount of space]
[?>]

到目前为止,我有这个:

的index.php

$the_prophecy = file_get_contents("secret.php");
preg_match_all('~[<?|<?php]\s*[legendcool(](.*?)[)]\s*[?>]~',$the_prophecy,$matches) ;

secret.php

<title>Regex Match all characters between two strings - Stack Overflow</title>
<link rel="shortcut icon" href="http://cdn.sstatic.net/stackoverflow/img/favicon.ico">
<?php          legendcool({'',''})       ?>
<link rel="apple-touch-icon image_src" href="http://cdn.sstatic.net/stackoverflow/img/

例如,在secret.php中,我想获得{'',''}

你们中的任何人都知道如何调整preg_match_all以我想要的方式工作吗?

3 个答案:

答案 0 :(得分:1)

正则表达式中的一些错误:

  1. 方括号应替换为圆形
  2. ?应该被转义,因为它在正则表达式中具有特殊含义
  3. 如果你想匹配新的行,也需要使用
  4. flag s(DOTALL)
  5. 更好的正则表达式可以是这样的:

    ~<\?(?:php)?(.+?)\?>~s
    

    使用上述建议,您的最终解决方案将是:

    preg_match_all('~<\?(?:php)?\s+legendcool\(([^)]+)\).*?\?>~s', $the_prophecy, $matches);
    print_r($matches[1]);
    // OUTPUT:  {'',''}
    

答案 1 :(得分:1)

请允许我首先引导您访问PHP PCRE Cheat Sheet,这是PHP中所有正则表达式需求的快速参考。

接下来,在正则表达式中使用[]用于字符组,基本上意味着“匹配任何这些字符”,例如[afd]将匹配任何字符afd

答案 2 :(得分:0)

您混淆了括号,[<?|<?php]应该是(<?|<?php)。如果您不希望它捕获任何内容,请写下(?:<?|<?php)