我已经看到很多(在你把它作为副本标记之前)如何做到这一点,但由于某种原因我的输出不起作用:
// $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
...
)
那么有更好的方法来匹配我列出的分隔符吗?
答案 0 :(得分:5)
我会在你的情况下使用这样的正则表达式:
preg_split('/,? ?and | ?[,;] ?/', $str)
如果可能出现其他空格字符(例如TAB)或甚至\s
而不是\s*
,则可能还希望按?
替换空格以涵盖多个空格空格。
答案 1 :(得分:0)
你从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);
?>
答案 2 :(得分:0)
在您的代码中,在Name 6, and Name 7
之间,首先,
被替换,然后是and
。
因此你最终得到这个字符串:
姓名1,姓名2,姓名3,姓名4,姓名5,姓名6,姓名7,姓名8,姓名9
因此,空值......
在输出之前清理结果数组,你应该没问题:
$str_out = array_filter($str_new);
答案 3 :(得分:0)
您的方法存在的问题是,您希望使用错误的方法解决问题。即使您设法创建分隔符列表,如果您需要,例如,会发生什么?用另一个字符分隔单词,比如一个'$'符号?
您应该实现一个tokenizer / lexer,它通过char读取输入char,并区分空格,终端和非终端符号/字符。然后词法分析器将生成一系列令牌,例如
STRING-SYMBOL:'NAME1'
KOMMA-SYMBOL
AND-SYMBOL
STRING-SYMBOL:'NAME2'
SEMICOLON-SYMBOL
STRING-SYMBOL:'NAME3'
AND-SYMBOL
...
EOF-SYMBOL
然后您只需过滤掉任何非STRING-SYMBOL
符号(或者使用AND-SYMBOL
组合字符串。这是(imho)唯一坚如磐石的解决方案。它也很容易扩展和推广:一旦你编写了一个很好的tokenizer / lexer,就可以使用这种方法来解决几乎任何字符串分析问题。
编写标记生成器通常非常简单:它通过char扫描输入char,然后首先对char进行分类。它实现了一个简单的状态机来收集将形成符号的字符。
您可以尝试使用正则表达式实现此功能,这也应该是可行的。无论如何,tokenizer将生成一个令牌列表(或者根据请求检索下一个令牌)。它将检索的最后一个标记是EOF-TOKEN
,表示输入序列已经完全遍历。