Php 使用正则表达式从字符串中提取标记

Php 使用正则表达式从字符串中提取标记,php,regex,split,Php,Regex,Split,我被卡住了。并不是说我是regex的专家,事实上恰恰相反。但我没能解决一个看似显而易见的任务 原始字符串: tag:tag1; tag:tag2;tag:tag3; tag:tag4 我需要提取标记,即“tag:”和下一个分号(或最后一个标记的行尾)之间的所有内容。到目前为止,我能得到的最好结果就是这个 {tag:(?P<tag>[^;]+)(;|$)}i {tag:(?P[^;]+)(;|$)}i 例如,以“tag:”开头,然后允许除分号以外的任何符号,然后以分号或行尾结束。

我被卡住了。并不是说我是regex的专家,事实上恰恰相反。但我没能解决一个看似显而易见的任务

原始字符串:

tag:tag1; tag:tag2;tag:tag3; tag:tag4
我需要提取标记,即“tag:”和下一个分号(或最后一个标记的行尾)之间的所有内容。到目前为止,我能得到的最好结果就是这个

{tag:(?P<tag>[^;]+)(;|$)}i
{tag:(?P[^;]+)(;|$)}i
例如,以“tag:”开头,然后允许除分号以外的任何符号,然后以分号或行尾结束。并进行不区分大小写的匹配。但是对于
preg_match
preg_match_all
,我只得到带有这个正则表达式的第一个标记:(

另一种实现我想要的功能的方法(但不带循环)是使用PHP的标记字符串数组。在这里可以很好地工作:

$text = 'tag:tag1; tag:tag2;tag:tag3; tag:tag4';
preg_match_all('{tag:(?P<tag>[^;]+)(;|$)}i', $text, $matches);
print_r($matches['tag']);
使用str_replace()+explode(),就像Jelle Keizer建议的那样

   <?php
    $text = 'tag:tag1; tag:tag2;tag:tag3; tag:tag4';  

    $text = str_replace(array('tag:', ' '),array('', ''), $text);
    $array = explode(';', $text);

    var_dump($array);

你的正则表达式和
preg_match_all()
工作得很好。我无法重现这种行为。你不能去掉标记:然后使用explode(;”,$string);?奇怪的分隔符
{
}
。我不知道这是可能的。保罗,太棒了,非常感谢!我试着使用,但不知怎么的,它没有正常工作。@Rudie:你为什么不喜欢我的定界符?:)我在普通语言中找不到任何不太可能的东西。@texnic你在开玩笑吗?我爱上了你的分隔符!我喜欢卷曲的对称分隔符。你可以随时叫醒我,为那些又大又圆的卷毛小狗。我只是不知道这是可能的。我一直认为delim的开头和结尾必须是一样的:
~~我
,我的最爱。
,当然还有
/../I
等等。@Rudie:很高兴在这里为至少有人的知识做出贡献,邻居!:)谢谢你的建议。我更喜欢正则表达式,因为它确保标记中的空格是可能的。
   <?php
    $text = 'tag:tag1; tag:tag2;tag:tag3; tag:tag4';  

    $text = str_replace(array('tag:', ' '),array('', ''), $text);
    $array = explode(';', $text);

    var_dump($array);
Array
(
    [0] => tag1
    [1] => tag2
    [2] => tag3
    [3] => tag4
)