如何让正则表达式“吞噬”一个角色?

时间:2009-06-26 02:38:04

标签: php regex

我有一个像这样的文本文件

{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

如何修改我的正则表达式才能使其正常工作?谢谢

修改

非常感谢您的回答。我改变了我的正则表达式

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

我还会研究前瞻性文章。

4 个答案:

答案 0 :(得分:7)

对于这种特殊情况,你可以这样做:

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

[^\{]表示“匹配任何不是左括号的字符”。这样做的好处是在输入结束时不需要{

更一般地说,您也可以像其他人提到的那样使用先行断言。

答案 1 :(得分:2)

您需要使用Look Ahead功能查找角色,而无需捕捉它。

您可以重新构建正则表达式。

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

答案 2 :(得分:2)

您可以将最后一部分更改为仅匹配非大括号字符而不是.+后跟大括号,如下所示:

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

答案 3 :(得分:1)