使用正则表达式从字符串中提取标签
问题描述:
我被卡住了。并不是说我是一个正则表达式,事实上恰恰相反。但我无法解决看似明显的任务。使用正则表达式从字符串中提取标签
原始字符串:
tag:tag1; tag:tag2;tag:tag3; tag:tag4
我需要提取标签,即“标签”之间的一切,接下来的分号(或行的最后标记的结束)。迄今为止我能得到的最好的结果是:
{tag:(?P<tag>[^;]+)(;|$)}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']);
输出:
Array
(
[0] => tag1
[1] => tag2
[2] => tag3
[3] => tag4
)
答
使用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
你的正则表达式和'preg_match_all()'工作就好了。 – mario 2014-10-12 12:46:18
我未能重现此行为。 – Unihedron 2014-10-12 12:47:11
不能删除标签:然后使用explode(“;”,$ string); ? – 2014-10-12 12:47:23