我有一个像这样的文本文件
{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';
我还会研究前瞻性文章。
答案 0 :(得分:7)
对于这种特殊情况,你可以这样做:
$regex = '/\{([a-z]+?)\}([^\{]+)/i';
[^\{]
表示“匹配任何不是左括号的字符”。这样做的好处是在输入结束时不需要{
。
更一般地说,您也可以像其他人提到的那样使用先行断言。
答案 1 :(得分:2)
答案 2 :(得分:2)
您可以将最后一部分更改为仅匹配非大括号字符而不是.+
后跟大括号,如下所示:
$regex = '/\{([a-z]+?)\}([^{]+)/i';
答案 3 :(得分:1)