【问题标题】:preg_split() a string of tags delimited by commas, double quotes, or spacespreg_split() 由逗号、双引号或空格分隔的标签字符串
【发布时间】:2011-12-28 04:18:06
【问题描述】:

我正在尝试preg_split() 由逗号、双引号或空格分隔的标签字符串。

这是我到目前为止的代码。这样做的目的是让用户在不使用 javascript 解决方案的情况下尽可能轻松地输入标签(我稍后可能会用到)。

$tagfield = 'Tag Tag2, Tag3 "Tag" "A Tag"';

$tags = preg_split('/[^(.)^a-zA-Z0-9]+/', $tagfield, NULL, PREG_SPLIT_NO_EMPTY);

我得到的输出是:

array (
    0 => 'Tag',
    1 => 'Tag2',
    2 => 'Tag3',
    3 => 'Tag',
    4 => 'A',
    5 => 'Tag',
)

我想要的输出是:

array (
    0 => 'Tag',
    1 => 'Tag2',
    2 => 'Tag3',
    3 => 'Tag',
    4 => 'A Tag',
)

我不太确定应该如何获取两个单词的标签。

【问题讨论】:

  • 为什么...为什么不选择单个分隔符?
  • 归结为用户体验。这是我验证过程的一部分,而不是给用户一个错误,我希望它只是为他们“弄清楚”,因为它可以完成。
  • 也许这只是一个“高级用户”的事情,但我更愿意被告知我可以使用一个分隔符,并且被告知 预先 而不是坐在那里试图猜测程序使用的是什么扭曲的逻辑。
  • 我理解这种感觉,这就是为什么我要明确告诉用户某种格式是首选的,但我不想在可以轻松修复它时惩罚他们。
  • 您的 cmets 似乎并没有提供帮助。你为什么评论?

标签: php regex arrays preg-split


【解决方案1】:

为什么不是 preg_match_all?

preg_match_all('/([a-zA-Z0-9]+)|(?:"([a-zA-Z0-9 ]+)")/i', 'Tag Tag2, Tag3 "Tag" "A Tag"', $result);

编辑:

我接受解决方案中不雅的部分,但它不返回双引号。这是我之前提到的代码。请粘贴您找到的更优雅的那个:)

<?php
preg_match_all('/([a-zA-Z0-9]+)|(?:"([a-zA-Z0-9 ]+)")/i', 'Tag Tag2, Tag3 "Tag" "A Tag"', $result);
$result=array_filter(array_map('array_filter', $result));
print_r(array_merge($result[1], $result[2]));
?>

输出:

Array
(
    [0] => Tag
    [1] => Tag2
    [2] => Tag3
    [3] => Tag
    [4] => A Tag
)

【讨论】:

  • 这是我使用这个时得到的输出:array ( 0 =&gt; array ( 0 =&gt; 'Tag', 1 =&gt; 'Tag2', 2 =&gt; 'Tag3', 3 =&gt; '"Tag"', 4 =&gt; '"A Tag"', ), 1 =&gt; array ( 0 =&gt; 'Tag', 1 =&gt; 'Tag2', 2 =&gt; 'Tag3', 3 =&gt; '', 4 =&gt; '', ), 2 =&gt; array ( 0 =&gt; '', 1 =&gt; '', 2 =&gt; '', 3 =&gt; 'Tag', 4 =&gt; 'A Tag', ), )
  • 我不是 PHP 人,但是合并第二个和第三个数组并删除空值是您要寻找的结果,对吧?
  • 这样做对我来说似乎有点不雅。更不用说,正则表达式返回双引号,这是不需要的。不过感谢您的建议。
  • 你的代码是正确的,不优雅的工作代码比不工作的优雅代码更好。如果我发现更好的东西,我会发布。感谢您的帮助:)
【解决方案2】:

在你的 preg 中留出空间 /[^(.)^a-zA-Z0-9/s]+/ slash s

【讨论】:

  • 我尝试了您的解决方案和一些模组,但无法正常工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-28
  • 1970-01-01
相关资源
最近更新 更多