Какой самый короткий способ написать это регулярное выражение? - PullRequest
0 голосов
/ 10 августа 2011

У меня есть следующий шаблон:

\<\?php\s*\/\*\s*magicNoteStart\s*\*\/([\w\W]*)\s*\/\*\s*magicNoteEnd\s*\*\/\s*\?\>

Для сравнения со следующим образцом:

<?php
/* magicNoteStart */
$ancillaries = array(
    'Page Information' => array(
        'hidden' => true
    ),
    'Metadata' => array(
        'hidden' => true
    ),
    'Revision Note' => array(
        'hidden' => true
    )
);
/* magicNoteEnd */
?>
<html>
    <head>
        <title>Test HTML</title>
    </head>
</html>

Таким образом, цель в том, чтобы иметь возможность использовать регулярное выражение для preg_match() и preg_replace().

При использовании с preg_replace() он должен удалить всю PHP-часть кода в верхней части примера, поэтому в настоящее время у меня есть:

$contents = preg_replace(self::$magic_note_regex, '', $contents, 1);

preg_match() используется для извлечения всего между /* magicNoteStart */ и /* magicNoteEnd */, так что он может быть эффективно eval() ed. В настоящее время мой код для этого выглядит так:

if(preg_match(self::$magic_note_regex, $contents, $matches)) {
    return trim($matches[1]);
}

Это устаревшая система, и я не могу нарушить обратную совместимость. Я не могу гарантировать, сколько будет пустого пространства между чем-либо, поэтому мое чрезмерное использование \s* в схеме, которую я ввел выше.

Так, каков самый короткий способ написать это регулярное выражение?

Ответы [ 2 ]

1 голос
/ 10 августа 2011

Попробуйте это:

$pattern = "#/\*\s*magicNoteStart\s*\*/.*\*\s*magicNoteEnd\s*\*/#s";

Я проигнорировал теги PHP, но вы можете добавить их обратно, если требуется.

0 голосов
/ 10 августа 2011

Как насчет

(\/\*\s*magicNoteStart\s*\*\/.*magicNoteEnd\s*\*\) //(I didd't test it)

, поскольку вы хотите его оценить, комментарии будут игнорироваться.

...