我被困住了。并不是说我是正则表达式的专家,事实上恰恰相反。但我未能解决看似明显的任务。
原始字符串:
tag:tag1; tag:tag2;tag:tag3; tag:tag4
我需要提取标签,即“tag:”和下一个分号(或最后一个标签的行尾)之间的所有内容。到目前为止我能得到的最好的是这个
{tag:(?P<tag>[^;]+)(;|$)}i
即。以“tag:”开头,然后允许除分号之外的任何符号,然后以分号或行尾结束。并且不区分大小写的匹配。但是对于preg_match
和preg_match_all
,我只得到这个正则表达式的第一个标记:(
另一种(但没有循环)方法来实现我想要的 - 一个标记字符串数组 - 使用PHP也很重要。
答案 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
)