2014-10-12 178 views
1

我被卡住了。并不是说我是一个正则表达式,事实上恰恰相反。但我无法解决看似明显的任务。使用正则表达式从字符串中提取标签

原始字符串:

tag:tag1; tag:tag2;tag:tag3; tag:tag4 

我需要提取标签,即“标签”之间的一切,接下来的分号(或行的最后标记的结束)。迄今为止我能得到的最好的结果是:

{tag:(?P<tag>[^;]+)(;|$)}i 

即,从“tag:”开始,然后允许除分号之外的任何符号,然后以分号或行尾结束。并做不区分大小写的匹配。但随着双方preg_matchpreg_match_all,我只得到与此正则表达式:(

另一种第一标签(但不循环)方法来实现我想要什么,一个标签的字符串数组,用PHP也算。

+1

你的正则表达式和'preg_match_all()'工作就好了。 – mario 2014-10-12 12:46:18

+0

我未能重现此行为。 – Unihedron 2014-10-12 12:47:11

+0

不能删除标签:然后使用explode(“;”,$ string); ? – 2014-10-12 12:47:23

回答

1

在这里工作罚款:

$text = 'tag:tag1; tag:tag2;tag:tag3; tag:tag4'; 
preg_match_all('{tag:(?P<tag>[^;]+)(;|$)}i', $text, $matches); 
print_r($matches['tag']); 

输出:

Array 
(
    [0] => tag1 
    [1] => tag2 
    [2] => tag3 
    [3] => tag4 
) 
+0

奇怪的分隔符'{'和'}'。我不知道这是可能的。 – Rudie 2014-10-12 13:24:51

+0

保罗,真棒,非常感谢!我正在尝试使用http://preg_match_all.onlinephpfunctions.com/并以某种方式无法正常工作。 – texnic 2014-10-12 13:53:58

+0

@Rudie:你为什么不喜欢我的分隔符? :)在通常的语言里我找不到任何可能性不大的东西。 – texnic 2014-10-12 13:54:32

1

使用str_replace()函数+爆炸(),像耶勒科泽尔建议。

<?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 
) 
+0

感谢您的建议。我比较喜欢regex,因为它可以确保标签中的空格是可能的。 – texnic 2014-10-12 13:53:04

相关问题