Php 查找[abc]但不查找[;;abc]的正则表达式

Php 查找[abc]但不查找[;;abc]的正则表达式,php,regex,Php,Regex,太晚了,我都弄不清楚 我的文本如下所示: This is a [;;Text] and I want to match [center]everything without ;;[/center] 我使用它转换为HTML: return preg_replace('/\[(.+)\]/U', '<$1>', $text); 返回preg\U replace('/\[(.+)\]/U',''$text); 我认为模式/\[^;{2}](.+)\]/U应该能起作用,但它不起作用

太晚了,我都弄不清楚

我的文本如下所示:

 This is a [;;Text] and I want to match [center]everything without ;;[/center]
我使用它转换为HTML:

 return preg_replace('/\[(.+)\]/U', '<$1>', $text);
返回preg\U replace('/\[(.+)\]/U',''$text);

我认为模式
/\[^;{2}](.+)\]/U
应该能起作用,但它不起作用。

我发现了以下模式:
\[(

指向演示的链接:


请注意,它只在特定情况下匹配,如果您想要任何带有空格或其他特殊字符的标记,它将不起作用,并且可能需要一些修改。

如果您想通过跳过
的发生来仅提取
[]
中的文本,您可以尝试以下操作。我刚刚修改了@Mehdi regex


(?我提出的与此模式匹配的正则表达式非常简单:

[[][A-Za-z0-9]*[]]
要将其分解为更小的部分以便于理解:

[[] begins with "["

[A-Za-z0-9]* contains one or more alphabet or numeric character
          
[]] ends with "]"
这将匹配[center],但不匹配[/center]或[;;Text],因为它们具有特殊字符,并且正则表达式只查找字母和数字


编辑:如果要匹配除“;”之外的每个字符,则可以使用以下命令:

[[][^;]*[]]
这遵循非常相似的逻辑:

[[] begins with "["

[^;]* one or more character that is not ";"

[]] ends with "]"

它将匹配
[center]
[/center]
但不匹配
[;文本]

例如,您可以匹配
[/code>和可选的
/
,后跟单词字符,直到结束
]

请注意,在这种情况下,不需要使用
/U
标志来使量词变懒

\[/?\w+]

$text = ' This is a [;;Text] and I want to match [center]everything without ;;[/center]';
$result = preg_replace('/\[(\/?\w+)]/', "<$1>", $text);
echo $result;

你不应该在[]内使用{}。你可以使用这个模式[;]{2}(+)]Mhh,它不起作用。它仍然与“;”匹配。噢,请试试这个[(?!)(.*)]”为什么你需要匹配这个语法?因为这里最好的答案是“如果可以,就停止使用这个语法”,而不是使用正则表达式,可能开始使用一个真正的模板引擎?你能告诉我什么是模板引擎,我可以使用哪一个吗?是不是一个外部php库,我加载到我的项目中,然后用它来替换模板标记?你测试这个构造
[Aa Zz]
?这个
[a-z]
也不一样[A-Za-z]
使用类似于
([Aa Zz]|[0-9])
的结构也不是很有效。您可以将其编写为
[A-Za-z0-9]*
我在regex101上为php所做的测试似乎与[Aa Zz]不一样,但[A-z]没有问题。我毫不怀疑您在这一点上是正确的。
[A-z]
是一个有效范围,但请查看此答案匹配的字符。感谢您澄清这一点,并根据您提供的建议对答案进行更改。对于第一种模式,您可以匹配可选的正斜杠以匹配两者,请参阅。对于第二种模式,您的思路正确,但如果字符串介于n不包含
它将与它过度匹配。在这种情况下,您可以做的是排除方括号。如果您不想在方括号内也允许分号,请参见此断言将始终为真
\[(?当您第一次匹配
[
然后断言右边的直接不是
我只匹配括号中的标记,这就是regex101中出现的,我假设我们只讨论标记。是的,但是可以忽略
(?因为它没有效果。你也可以省略
+?
之后的问号,使其不贪婪。
\w
不能匹配
]
所以你可以省略它。我想尽可能具体,但你绝对正确,这解决了你的问题吗?对我来说没有问题:-)我只是作为一个小提示添加了它,说明模式可以简化。负前瞻的用法非常好。我试图用负前瞻解决这个问题,但无法实现。谢谢。这一个很好,因为它还捕获了像
[center;]
[(?!;;)([^][*])这样的条目这一个非常完美!谢谢!我看到你重新打开了这个问题,我想知道它是否也是一个重复的问题?@Ryszard捷克我重新打开它,因为我认为这是一个帮助程序员使用他们尝试过但失败的代码的地方。许多正则表达式问题可能有重复的答案,这与所使用的技术有关,但在这种情况下我改变了将否定字符类改为向前看,并将量词改为否定字符类,以更新我认为更好的模式。如果你真的认为这不是重复,你可以重新打开
This is a [;;Text] and I want to match <center>everything without ;;</center>
\[(?!;;)([^][]*)]