3

我已经看到很多(在您将其标记为重复之前)如何执行此操作,但由于某种原因,我的输出无法正常工作:

// $delimiters wanted: ', ' | '; ' | ',' | ';' | ' , ' | ', and ' | ' and ' | ',and '
$str = 'Name 1, Name 2; Name 3;Name4 , Name 5,Name 6, and Name 7,and Name 8 and Name 9';
$delimiter = array(
    ', ',
    '; ',
    ';',
    ',',
    ' , ',
    ', and ',
    ' and ',
    ',and '
);
$str_new = explode( $delimiter[0], str_replace($delimiter, $delimiter[0], $str) );

但是,当我输出数组时,我得到了这个:

<?php foreach($str_new as $new) { echo 'a' . $new; } ?>

Array (
    [0] => Name 1
    [1] => Name 2
    [2] => Name 3
    [3] =>        // WHY IS THIS EMPTY?
    [4] => Name 4
    ...
)

那么有没有更好的方法来匹配我列出的分隔符​​?

4

4 回答 4

5

我会在你的情况下使用这样的正则表达式:

preg_split('/,? ?and | ?[,;] ?/', $str)

\s如果可能出现其他空格字符(例如 TAB),您可能还想替换空格,甚至\s*代替?覆盖多个空格的情况。

于 2013-04-28T08:51:46.937 回答
1

您是否从 php.net 尝试过类似的操作?

<?php

//$delimiters has to be array
//$string has to be array

function multiexplode ($delimiters,$string) {

    $ready = str_replace($delimiters, $delimiters[0], $string);
    $launch = explode($delimiters[0], $ready);
    return  $launch;
}

$text = "here is a sample: this text, and this will be exploded. this also | this one too :)";
$exploded = multiexplode(array(",",".","|",":"),$text);

print_r($exploded);
?>

或者类似PHP 中的多个分隔符拆分字符串

于 2013-04-28T08:41:56.730 回答
0

您的方法中的问题是,您想使用错误的方式解决问题。即使您设法创建了一个分隔符列表,如果您需要例如用另一个字符分隔单词会发生什么,比如说,'$' 符号?

您应该实现一个分词器/词法分析器,它按字符读取输入字符并区分空格、终端和非终端符号/字符。然后词法分析器将生成一系列标记,例如

STRING-SYMBOL:'NAME1' 
KOMMA-SYMBOL 
AND-SYMBOL 
STRING-SYMBOL:'NAME2' 
SEMICOLON-SYMBOL 
STRING-SYMBOL:'NAME3' 
AND-SYMBOL
...
EOF-SYMBOL

然后,您只需过滤掉任何非STRING-SYMBOL符号(或者您使用 . 组合字符串AND-SYMBOL。这是(恕我直言)唯一坚如磐石的解决方案。它也很容易扩展和概括:一旦您编写了一个好的分词器/词法分析器,您就可以将这种方法用于几乎任何字符串分析问题。

编写分词器通常非常简单:它按字符扫描输入字符并首先对字符进行分类。它实现了一个简单的状态机来收集将形成符号的字符。

您可以尝试使用正则表达式来实现这一点,这也应该是可能的。无论如何,tokenizer 将生成一个令牌列表(或根据请求检索下一个)。它将检索的最后一个标记是EOF-TOKEN指示输入序列已被完全遍历。

于 2013-04-28T09:08:12.453 回答
0

在您的代码中,在 之间Name 6, and Name 7,首先,被替换,然后是and.

因此你最终得到这个字符串:

名称 1、名称 2、名称 3、名称 4、名称 5、名称 6、、名称 7、名称 8、名称 9

因此,空值...

在输出之前清理你的结果数组,你应该没问题:

$str_out = array_filter($str_new);
于 2013-04-28T08:52:26.810 回答