如何使用正则表达式匹配“标签”列表& PHP

时间:2011-11-10 19:55:45

标签: php regex

我有一个表单输入字段,可以接受来自用户的多个“标记”,有点像这个网站上的标记!因此,例如用户可以输入如下内容:

php mysql regex

......哪个好看&很容易将多个标签分开,因为我可以在空格上爆炸()。我最终会:

array('php', 'mysql', 'regex')

然而事情会变得复杂一些,因为用户可以使用逗号分隔标记 空间和对多字标签使用双引号。

所以用户也可以输入:

php "mysql" regex, "zend framework", another "a, tag with punc $^&!)(123 *note the comma"

所有这些都是有效的。这应该产生:

array('php', 'mysql', 'regex', 'zend framework', 'another', 'a, tag with punc $^&!)(123 *note the comma')

我不知道如何编写一个正则表达式,它首先匹配双引号中的所有内容,然后在逗号或空格上爆炸字符串&最后匹配其他一切。我想我会使用preg_match_all()吗?

有人能指出我正确的方向!?非常感谢。

1 个答案:

答案 0 :(得分:2)

试试这个正则表达式。我针对你的字符串对它进行了测试,它正确地取出了各个标签:

("([^"]+)"|\s*([^,"\s]+),?\s*)

此代码:

$string = 'php "mysql" regex, "zend framework", another "a, tag with punc $^&!)(123 *note the comma"';
$re = '("([^"]+)"|\s*([^,"\s]+),?\s*)';
$matches = array();
preg_match_all($re, $string, $matches);
var_dump($matches);

对我产生了以下结果:

array(3) {
  [0]=>
  array(6) {
    [0]=>
    string(4) "php "
    [1]=>
    string(7) ""mysql""
    [2]=>
    string(8) " regex, "
    [3]=>
    string(16) ""zend framework""
    [4]=>
    string(9) " another "
    [5]=>
    string(44) ""a, tag with punc $^&!)(123 *note the comma""
  }
  [1]=>
  array(6) {
    [0]=>
    string(0) ""
    [1]=>
    string(5) "mysql"
    [2]=>
    string(0) ""
    [3]=>
    string(14) "zend framework"
    [4]=>
    string(0) ""
    [5]=>
    string(42) "a, tag with punc $^&!)(123 *note the comma"
  }
  [2]=>
  array(6) {
    [0]=>
    string(3) "php"
    [1]=>
    string(0) ""
    [2]=>
    string(5) "regex"
    [3]=>
    string(0) ""
    [4]=>
    string(7) "another"
    [5]=>
    string(0) ""
  }
}

希望有所帮助。