0

我正在使用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]
[?>]

到目前为止我有这个:

索引.php

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

秘密.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的工作方式吗?

4

3 回答 3

1

正则表达式中的几个错误:

  1. 方括号应该换成圆括号
  2. ?应该转义,因为它在正则表达式中具有特殊含义
  3. s如果您还想匹配新行,则需要使用标志(DOTALL)

一个更好的正则表达式可以是这样的:

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

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

preg_match_all('~<\?(?:php)?\s+legendcool\(([^)]+)\).*?\?>~s', $the_prophecy, $matches);
print_r($matches[1]);
// OUTPUT:  {'',''}
于 2013-05-28T20:02:52.923 回答
1

请允许我首先将您引导至PHP PCRE 备忘单,这是您在 PHP 中所有正则表达式需求的快速参考。

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

于 2013-05-28T20:03:18.470 回答
0

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

于 2013-05-28T20:00:52.493 回答