2013-05-28 4 views
0

Я использую preg_match_all, пытаясь соответствовать:preg_match_all регулярное выражение Issue

[<? 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/ 

Например, в секрете. php, я бы хотел получить {'',''}

Кто-нибудь из вас знает, как я могу настроить мой preg_match_all, чтобы работать так, как я хочу?

ответ

1

Пара ошибок в своем регулярном выражении:

  1. Квадратные скобки должны быть заменены круглыми
  2. ? должны быть экранированы, так как его особое значение в регулярных выражениях
  3. флаг s (DOTALL) должен использовать, если вы хотите также соответствовать новым линиям

Лучшее регулярное выражение может быть таким:

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

Используя выше предложения, окончательное решение будет:

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

заменены на обычные, что вы имеете в виду? :) – Thorbear

+0

cool regex, вы знаете, как я могу сопоставить «любое количество пробелов»? Я прочитал это works '\ s *', но он, похоже, не работает с моим regex –

+1

'\ s *' должен работать для соответствия 0 или более пробелов. Вам лучше использовать '\ s +' для сопоставления 1 или более пробелов или вкладок или новой строки. – anubhava

0

Вы скопировали скобки и парсеры [<?|<?php] должно быть (<?|<?php). Если вы ничего не хотите, чтобы записать что-либо, напишите (?:<?|<?php).

+0

Как указывает @anubhava, знаки вопроса должны быть экранированы. – mzedeler

1

Позвольте мне сначала направить вас к PHP PCRE Cheat Sheet, который является быстрым справочником для всех ваших потребностей регулярных выражений в PHP.

Далее, использование [ и ] в регулярном выражении для групп символов, и в основном означает «соответствовать любому из этих символов», например [afd] будет соответствовать любому из символов a, f или d.

Смежные вопросы