Multiple explode characters with comma and - (hyphen)
Asked Answered
S

2

35

I want to explode a string for all:

  1. whitespaces (\n \t etc)
  2. comma
  3. hyphen (small dash). Like this >> -

But this does not work:

$keywords = explode("\n\t\r\a,-", "my string");

How to do that?

Solitude answered 9/9, 2010 at 17:33 Comment(0)
S
68

Explode can't do that. There is a nice function called preg_split for that. Do it like this:

$keywords = preg_split("/[\s,-]+/", "This-sign, is why we can't have nice things");
var_dump($keywords);

This outputs:

  array
  0 => string 'This' (length=4)
  1 => string 'sign' (length=4)
  2 => string 'is' (length=2)
  3 => string 'why' (length=3)
  4 => string 'we' (length=2)
  5 => string 'can't' (length=5)
  6 => string 'have' (length=4)
  7 => string 'nice' (length=4)
  8 => string 'things' (length=6)

BTW, do not use split, it is deprecated.

Sining answered 9/9, 2010 at 17:35 Comment(0)
T
13

... or if you don't like regexes and you still want to explode stuff, you could replace multiple characters with just one character before your explosion:

$keywords = explode("-", str_replace(array("\n", "\t", "\r", "\a", ",", "-"), "-", 
  "my string\nIt contains text.\rAnd several\ntypes of new-lines.\tAnd tabs."));
var_dump($keywords);

This blows into:

array(6) {
  [0]=>
  string(9) "my string"
  [1]=>
  string(17) "It contains text."
  [2]=>
  string(11) "And several"
  [3]=>
  string(12) "types of new"
  [4]=>
  string(6) "lines."
  [5]=>
  string(9) "And tabs."
}
Twain answered 19/6, 2018 at 7:18 Comment(2)
This technique makes 6 passes over the input string (full traversal of the string x6) before exploding on the hyphen. I would be using the much simpler, single-function call in shamittomar's answer because it only makes one pass over the input string.Poinsettia
But anything involving regex is usually slower. An actual test would be required to determine if there is a significant difference between the two methods, and which is slower.Madlin

© 2022 - 2024 — McMap. All rights reserved.