Как сделать так, чтобы регулярное выражение не «глотало» персонажа? - PullRequest
0 голосов
/ 26 июня 2009

У меня есть текстовый файл так

{word} definition
{another word} another definition {word} they don't have to be on different lines

Регулярное выражение, которое я использовал, было

    $regex = '/\{([a-z]+?)\}(.+?)\{/i';

Это, однако, вызывает проблемы в том, что он глотает последнюю фигурную скобку {, и тогда он не будет соответствовать следующей {в следующем слове.

Чтобы продемонстрировать, я сделал это для целей отладки

echo preg_replace($regex, '<b style="background-color: red;">$1</b><b style="background-color: yellow;">$2</b>', $content);

Вот пример моего вывода (обратите внимание, что в следующем слове нет открывающей скобки, поэтому в регулярном выражении она не совпадает)

<b style="background-color: red;">shrub</b><b style="background-color: yellow;"> Multi stemmed woody plant</b>Abaxial}    side or face away from the axis

Как я могу изменить свое регулярное выражение, чтобы заставить это работать? Спасибо

EDIT

Большое спасибо за ваши ответы. Я изменил свое регулярное выражение следующим образом

$regex = '/\{([a-z\-\s]+?)\}([^\{]+)/i';

Я также загляну в предварительные статьи.

Ответы [ 4 ]

7 голосов
/ 26 июня 2009

Для этого конкретного случая вы можете сделать:

$regex = '/\{([a-z]+?)\}([^\{]+)/i';

[^\{] означает «соответствовать любому символу, который не является левой скобкой». Это также имеет то преимущество, что в конце ввода не требуется {.

В более общем смысле вы также можете использовать косвенные утверждения, как уже упоминали другие.

2 голосов
/ 26 июня 2009

Вы можете изменить последнюю часть так, чтобы она соответствовала только не фигурным скобкам, а .+, за которыми следует фигурная скобка, например:

$regex = '/\{([a-z]+?)\}([^{]+)/i';
2 голосов
/ 26 июня 2009

Вы захотите использовать функцию Look Ahead , чтобы найти персонажа без его захвата.

Вы можете реструктурировать свое регулярное выражение следующим образом.

$regex = '/\{([a-z]+?)\}(.+?)(?={)';
1 голос
/ 26 июня 2009
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...