PHP正则表达式,从文本中提取所有自定义标记

PHP正则表达式,从文本中提取所有自定义标记,php,regex,Php,Regex,简单地说,我需要从文本块中提取所有用大括号括起来的字符串,如 这里有一个{tag},但是这里也有{tag_2},然后再次…{tag_3}。。。这里,但周围有一些垃圾 我想得到一个tag数组,tag_2和tag_3。 标记只能包含单词字符 我试过这个: $tags = array(); preg_match_all("/\{\w+\}/s", $data['text'], $tags); 如果在上述文本片段上运行,则标记数组返回空 编辑: 我为给大家带来的麻烦向大家道歉,后来我把事情搞砸了。我是

简单地说,我需要从文本块中提取所有用大括号括起来的字符串,如

这里有一个{tag},但是这里也有{tag_2},然后再次…{tag_3}。。。这里,但周围有一些垃圾

我想得到一个tag数组,tag_2和tag_3。 标记只能包含单词字符

我试过这个:

$tags = array();
preg_match_all("/\{\w+\}/s", $data['text'], $tags);
如果在上述文本片段上运行,则标记数组返回空

编辑:


我为给大家带来的麻烦向大家道歉,后来我把事情搞砸了。我是通过$tags而不是$tags[0]捕获标记的,因此我的合并数组总是空的。

如果您的正则表达式中缺少(可选)下划线,可能是:

$tags = array();
preg_match_all("/\{[a-z]+(?:_[1-9][0-9]*)?\}/s", $data['text'], $tags);
正则表达式的情况并非如此,因为
\w
包含下划线。将问题留给下面的评论。

效果很好:

<?php
$text = 'Here is a {tag}, but here {tag_2} as well, and then again ...{tag_3}... here but with some trash around it.';
$tags = array();
preg_match_all("/\{\w+\}/s", $text, $tags);
print_r($tags);
?>
您的
$data['text']
可能是空的


使用测试。

什么不适用于您的正则表达式?缺少标记名中的
?标记数组返回为空。您是否在不转义大括号的情况下尝试过它?我不认为他们需要逃走。巴特是对的,我后来把其他事情搞砸了。正则表达式真的起作用了,对不起大家!您的正则表达式似乎正确,请使用
/sui
修饰符进行更好的匹配,但它应该是这样工作的,错误在其他地方,可能
$data['text']
无效或为空。我认为下划线是单词字符,因此包含在w+?我明白了。谢谢,但是Bart最终是对的,正则表达式是有效的,我后来在组合来自不同文本的多个标记数组时把它弄糟了。@Swader:是的,在perl中,这包括下划线:的确。课文不是空的,但我后来确实搞砸了。运行array\u unique(array\u merge(/*此处有许多标记数组*/)返回空数组。谢谢编辑主要问题,解释我做错了什么。也许有一天它会帮助别人。
Array
(
    [0] => Array
        (
            [0] => {tag}
            [1] => {tag_2}
            [2] => {tag_3}
        )

)