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

时间:2014-10-12 12:43:09

标签: php regex split

我被困住了。并不是说我是正则表达式的专家,事实上恰恰相反。但我未能解决看似明显的任务。

原始字符串:

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

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

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

即。以“tag:”开头,然后允许除分号之外的任何符号,然后以分号或行尾结束。并且不区分大小写的匹配。但是对于preg_matchpreg_match_all,我只得到这个正则表达式的第一个标记:(

另一种(但没有循环)方法来实现我想要的 - 一个标记字符串数组 - 使用PHP也很重要。

2 个答案:

答案 0 :(得分: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
)

答案 1 :(得分:1)

使用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);

输出:

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