Я хочу разбить большую строку на ряд слов.
Например
$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
, или есть более эффективный метод? Я бы хотел, чтобы это было как можно быстрее, так как я буду разбивать сотни МБ файлов.
Я не думаю, что использование 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." }
Единственное отличие от вашего вывода – это последнее слово, потому что «слова». ! = «слово», и это не разделенное слово.
Это должно быть достаточно эффективным. Однако вы можете протестировать некоторые файлы и сообщить о производительности.
$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);
preg_split
может использоваться как:
$pieces = preg_split('/'.implode('\s*|\s*',$splitby).'/',$text,-1,PREG_SPLIT_NO_EMPTY);
Видеть это
Поскольку слова в вашем $ splitby массиве не являются регулярным выражением, возможно, вы можете использовать
str_split