Привет всем, я работаю над приложением PHP, которое должно анализировать файл .tpl с HTML в нем, и я делаю так, чтобы HTML мог иметь переменные и базовые операторы if в нем. Оператор if выглядит примерно так: `
<!--if ({VERSION} == 2)-->
Hello World
<!--endif -->
Чтобы разобрать это, я безуспешно пытался использовать preg_replace. Шаблон, который я пробовал, был
/<!--if\(([^\]*)\)-->([^<]*)<!--endif-->/e
который заменяется на
if ($1) { echo "$2"; }
Есть идеи, почему это не сработает и что я могу сделать, чтобы запустить его?






У вас есть пробел между endif и -->, но ваше регулярное выражение не позволяет этого.
Между прочим, это кажется ужасно небезопасным ... Есть ли причина, по которой вы не используете заранее созданный движок шаблонов, такой как Smarty?
Проверяя ваше регулярное выражение, я вижу, что ваша обратная косая черта применена к квадратной скобке. Чтобы использовать обратную косую черту внутри квадратных скобок внутри строки в кавычках, вам нужно дважды экранировать ее:
'/<!--if\(([^\\\]*)\)-->([^<]*)<!--endif-->/e'
Но я не знаю, зачем вы изобретаете новую структуру логики шаблонов, когда существуют такие решения, как Smarty и сам PHP.
Вот тестовый код в ответ на комментарии ниже.
testinput.tpl:
<!--if ({VERSION} == 2)-->
Hello World
<!--endif-->
match.php:
<?php
$template = file_get_contents('testinput.tpl');
print preg_match('/<!--if\(([^\\\]*)\)-->/e', $template) . "\n";
print preg_match('/<!--endif-->/e', $template) . "\n";
print preg_match('/<!--if\(([^\\\]*)\)-->([^<]*)<!--endif-->/e', $template) . "\n";
тестовый забег:
$ php match.php
1
1
1
Три обратной косой черты - это так же плохо, как и одна, Билл; вы все еще избегаете квадратной скобки.
Действительно? Я только что запустил его, и он вернул положительное совпадение с вводом. А с одной или двумя обратными косыми чертами выдает ошибку о несбалансированной квадратной скобке.
Хм. С четырьмя обратными косыми чертами он также возвращает положительное совпадение.
Как вы это тестируете и что содержали группы захвата? Я попробовал это в поле поиска EditPad, ошибок не было, но ничего не найдено. Java даже не примет его с нечетным количеством обратных косых черт.
Я не могу протестировать PHP напрямую, но я пробовал это в некоторых онлайн-тестерах регулярных выражений PHP, и он работает с двумя обратными косыми чертами, но не с одним или тремя. Не то чтобы это важно; в этом классе символов не должно быть обратной косой черты. Просто правая скобка.
Я думаю, вы хотели это сделать:
'/<!--if\(([^)]*)\)-->([^<]*)<!--endif-->/'
В вашем регулярном выражении есть только один класс символов:
[^\]*)\)-->([^<]
Вот что происходит:
Итак, после удаления дубликатов и сортировки символов в их порядке ASCII ваш класс символов эквивалентен этому:
[^()*+,\-<>\[\]^]
И круглые скобки за пределами класса символов по-прежнему сбалансированы, поэтому регулярное выражение компилируется, но оно даже близко не соответствует тому, что вы хотели.
Я собирался задать точно такой же вопрос ... Так что я просто поддерживаю ваше! ;-)