폭발에서 PHP 여러 구분 기호


146

문제가 있고 문자열 배열이 있으며 다른 구분 기호로 분해하고 싶습니다. 예를 들어

$example = 'Appel @ Ratte';
$example2 = 'apple vs ratte'

@ 또는 vs로 폭발하는 배열이 필요합니다.

나는 이미 해결책을 썼지 만 모두가 더 나은 해결책을 가지고 있다면 여기에 게시하십시오.

private function multiExplode($delimiters,$string) {
    $ary = explode($delimiters[0],$string);
    array_shift($delimiters);
    if($delimiters != NULL) {
        if(count($ary) <2)                      
            $ary = $this->multiExplode($delimiters, $string);
    }
    return  $ary;
}

나는 사람들이 "어떻게 어떻습니까", "어떻게 어떻습니까"와 같은 답변을 한 적이 없었습니다
HosseyNJF

답변:


290

사용은 어떻습니까

$ output = preg_split ( "/ (@ | vs) /", $ input);

놀랄 만한. 나는 이것이 explode()단일 논쟁에 어떻게 반대하는지 궁금하다
Ascherer

6
하드 스트링 파싱으로 큰 시스템을 만들고 싶다면 가장 효과적인 방법은 자체 파서입니다. 나중에 그것은 시스템 속도에 큰 영향을 미치지 않지만 당신은 당신을 위해 가장 쉬운 방법을 사용하는 것을
선호

9
작동하려면 일부 문자를 이스케이프해야합니다 (예 : /, ?). 예를 들면 다음과 같습니다 preg_split("/(\/|\?|=)/", $foo);..
kenorb

preg_split은 인덱스 배열을 반환합니다. 연관성을 반환 할 수 있습니까? 예를 들어 $str='/x/1/2/3/4/5/y/100/200/z/777'; preg_split("/(x|y|z|)/", $str); 볼 수 있습니다array('x'=>'1/2/3/4/5', 'y'=>'100/200', 'z'=>'777')
LINKeRxUA

2
사이에 공백이 / (있고 ) /preg_split이 작동하지 않는 것을 발견 했습니다. 공백을 제거하고 예상대로 작동합니다 (PHP 7 사용)
Boardy

69

첫 번째 문자열을 가져 와서 모두 @vsusing str_replace으로 바꾼 다음 분해 vs하거나 그 반대로 할 수 있습니다.


1
쉬운 해결책으로 Json 코드에서 "}}"을 "|"로 대체했습니다. 더럽지 만 효율적인 :)!
Baldráni

5
천재 : D
Deadpool

한 구분 기호가 다른 구분 기호의 상위 집합 인 (@|@!)경우에는 제대로 작동하지 않습니다 (예 : case)

2
@vaxquis 그렇습니다. str_replace ( '@!', '@', $ str); 가장 고유 한 구분 기호로 시작하십시오.
John Ballinger

@JohnBallinger 아니요, 그렇지 않습니다 . 원래 솔루션 이 제대로 작동하지 않고 아이디어에 결함이 있음 을 분명히 보여주는 다른 솔루션 을 제안했습니다 . 어느 것이 다른 것의 수퍼 세트인지 모른다고 상상해보십시오. 등을 확인하기 위해 다른 코드 줄을 만들어야합니다. 일반적으로 정규 표현식을 싫어하지만 유지 관리 및 단순성 측면에서 최상의 솔루션 인 경우입니다.

47
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);

//And output will be like this:
// Array
// (
//    [0] => here is a sample
//    [1] =>  this text
//    [2] =>  and this will be exploded
//    [3] =>  this also 
//    [4] =>  this one too 
//    [5] => )
// )

출처 : php.net의 php @ metehanarslan


14

strtr()다른 모든 구분 기호를 첫 번째 문자로 바꾸는 방법은 어떻습니까?

private function multiExplode($delimiters,$string) {
    return explode(
        $delimiters[0],
        strtr(
            $string,
            array_combine(
                array_slice(    $delimiters, 1  ),
                array_fill(
                    0,
                    count($delimiters)-1,
                    array_shift($delimiters)
                )
            )
        )
    );
}

읽을 수없는 일종의 것 같지만 여기서 작업하는 것으로 테스트했습니다.

원 라이너 ftw!


11

strtok()당신을 위해 작동 하지 않습니까?


1
그의 구분자가 'vs'인 것을 볼 때, 이것은 PHP docu가 말한 것처럼 작동하지 않을 수 있습니다 : strtok ()은 문자열 (str)을 작은 문자열 (토큰)로 나누고 각 토큰은 토큰의 모든 문자로 구분됩니다. 그리고 'vs'는 두 개의 문자를 포함합니다
mikewasmike

1
설명이나 예제를 포함하면 더 나은 답변이 될 것입니다. 그 것처럼, 그것은 더 많은 의견입니다 ...
billynoah

8

간단히 다음 코드를 사용할 수 있습니다.

$arr=explode('sep1',str_replace(array('sep2','sep3','sep4'),'sep1',$mystring));

4

이 솔루션을 사용해 볼 수 있습니다 .... 잘 작동합니다

function explodeX( $delimiters, $string )
{
    return explode( chr( 1 ), str_replace( $delimiters, chr( 1 ), $string ) );
}
$list = 'Thing 1&Thing 2,Thing 3|Thing 4';

$exploded = explodeX( array('&', ',', '|' ), $list );

echo '<pre>';
print_r($exploded);
echo '</pre>';

출처 : http://www.phpdevtips.com/2011/07/exploding-a-string-using-multiple-delimiters-using-php/


간단하고 깔끔한
Manojkiran. A

2

나는 이렇게한다 ...

public static function multiExplode($delims, $string, $special = '|||') {

    if (is_array($delims) == false) {
        $delims = array($delims);
    }

    if (empty($delims) == false) {
        foreach ($delims as $d) {
            $string = str_replace($d, $special, $string);
        }
    }

    return explode($special, $string);
}

이것은 내가 찾고 있었던 것입니다
Manojkiran.A

2

이건 어때요?

/**
 * Like explode with multiple delimiters. 
 * Default delimiters are: \ | / and ,
 *
 * @param string $string String that thould be converted to an array.
 * @param mixed $delimiters Every single char will be interpreted as an delimiter. If a delimiter with multiple chars is needed, use an Array.
 * @return array. If $string is empty OR not a string, return false
 */
public static function multiExplode($string, $delimiters = '\\|/,') 
{
  $delimiterArray = is_array($delimiters)?$delimiters:str_split($delimiters);
  $newRegex = implode('|', array_map (function($delimiter) {return preg_quote($delimiter, '/');}, $delimiterArray));
  return is_string($string) && !empty($string) ? array_map('trim', preg_split('/('.$newRegex.')/', $string, -1, PREG_SPLIT_NO_EMPTY)) : false;
}

귀하의 경우 $ delimiters 매개 변수에 Array를 사용해야합니다. 그런 다음 여러 문자를 하나의 구분 기호로 사용할 수 있습니다.

결과의 후행 공백에 신경 쓰지 않으면 array_map('trim', [...] )리턴 행에서 부품을 제거 할 수 있습니다 . (그러나이 경우에는 주저하지 마십시오. 계속 유지하십시오 preg_split.)

필수 PHP 버전 : 5.3.0 이상

여기서 테스트 할 수 있습니다


1

이 분리 방법을 사용하여 몇 가지 문제 (이 문자열이있는 경우 : 예 : "vs @ apples")가 발생하지만, 우리가 그것에 대해 생각하고 가능한 모든 충돌을 수정했다고 말하면, 당신은 모든 발행 수를 대체 할 수있는 $delimiter[1]$delimiter[n]$delimiter[0], 그리고 그 첫 번째에 분할?


1

구분 기호가 문자만이면 strtok여기에 더 적합한 것처럼 사용할 수 있습니다. while효과를 얻으려면 루프 와 함께 사용해야합니다 .


0

이것은 작동합니다 :

$stringToSplit = 'This is my String!' ."\n\r". 'Second Line';
$split = explode (
  ' ', implode (
    ' ', explode (
      "\n\r", $stringToSplit
    )
  )
);

보시다시피, 먼저 폭발 한 부분을 공간과 함께 붙인 다음 다시 분리하여 공간을 빼냅니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.