PHP preg_split: разделить строку на другие строки - PullRequest
4 голосов
/ 10 ноября 2011

Я хочу разбить большую строку на последовательность слов.

* 1003 Е.Г. *

$splitby = array('these','are','the','words','to','split','by');
$text = 'This is the string which needs to be split by the above words.';

Тогда результаты будут:

$text[0]='This is';
$text[1]='string which needs';
$text[2]='be';
$text[3]='above';
$text[4]='.';

Как я могу это сделать? preg_split - лучший способ или есть более эффективный метод? Мне бы хотелось, чтобы это было как можно быстрее, так как я буду разбивать сотни МБ файлов.

Ответы [ 4 ]

7 голосов
/ 10 ноября 2011

Это должно быть достаточно эффективно.Однако вы можете протестировать некоторые файлы и сообщить о производительности.

$splitby = array('these','are','the','words','to','split','by');
$text = 'This is the string which needs to be split by the above words.';
$pattern = '/\s?'.implode($splitby, '\s?|\s?').'\s?/';
$result = preg_split($pattern, $text, -1, PREG_SPLIT_NO_EMPTY);
4 голосов
/ 10 ноября 2011

preg_split может использоваться как:

$pieces = preg_split('/'.implode('\s*|\s*',$splitby).'/',$text,-1,PREG_SPLIT_NO_EMPTY);

Смотри

3 голосов
/ 10 ноября 2011

Я не думаю, что использование pcre regex необходимо ... если это действительно разбивает слова, которые вам нужны.

Вы можете сделать что-то вроде этого и в тесте посмотреть, будет ли он быстрее / лучше ...

$splitby = array('these','are','the','words','to','split','by');
$text = 'This is the string which needs to be split by the above words.';

$split = explode(' ', $text);
$result = array();
$temp = array();

foreach ($split as $s) {

    if (in_array($s, $splitby)) {
        if (sizeof($temp) > 0) {
           $result[] = implode(' ', $temp);
           $temp = array();
        }            
    } else {
        $temp[] = $s;
    }
}

if (sizeof($temp) > 0) {
    $result[] = implode(' ', $temp);
}

var_dump($result);

/* output

array(4) {
  [0]=>
  string(7) "This is"
  [1]=>
  string(18) "string which needs"
  [2]=>
  string(2) "be"
  [3]=>
  string(5) "above words."
}

Единственная разница с вашим выводом - последнее слово, потому что "слова".! = "слово", и это не разделенное слово.

0 голосов
/ 10 ноября 2011

Поскольку слова в вашем массиве $ splitby не являются регулярным выражением, возможно, вы можете использовать

str_split

...