Например, у меня есть статья, которая должна быть разделена по границе предложения, например « .
», « ?
», « !
» И « :
».
Но, как известно, независимо от того, preg_split
или explode
функция, они оба удаляют разделитель.
Любая помощь могла бы быть полезна!
РЕДАКТИРОВАТЬ:
Я могу только придумать код ниже, он отлично работает.
$content=preg_replace('/([\.\?\!\:])/',"\\1[D]",$content);
Спасибо!!! Все. Получать 3 ответа – всего пять минут! И я должен извиниться за то, что вы не смогли внимательно ознакомиться с руководством по PHP, прежде чем задавать вопрос. Сожалею.
preg_split
с флагом PREG_SPLIT_DELIM_CAPTURE
Возвращает массив совпадений с delimiter = 0
, match = 1
Вы можете установить флаг PREG_SPLIT_DELIM_CAPTURE при использовании preg_split
и захватить разделители. Затем вы можете взять каждую пару из 2 n и 2 n +1 и вернуть их вместе:
$parts = preg_split('/([.?!:])/', $str, -1, PREG_SPLIT_DELIM_CAPTURE); $sentences = array(); for ($i=0, $n=count($parts)-1; $i<$n; $i+=2) { $sentences[] = $parts[$i].$parts[$i+1]; } if ($parts[$n] != '') { $sentences[] = $parts[$n]; }
Примечание, чтобы упаковать разделительный разделитель в группу, иначе они не будут захвачены.
Я чувствую, что это стоит добавить. Вы можете сохранить разделитель в строке «после», используя regex lookahead для разделения:
$input = "The address is http://stackoverflow.com/"; $parts = preg_split('@(?=http://)@', $input); // $parts[1] is "http://stackoverflow.com/"
И если разделитель имеет фиксированную длину, вы можете сохранить разделитель в «до» части с помощью lookbehind:
$input = "The address is http://stackoverflow.com/"; $parts = preg_split('@(?<=http://)@', $input); // $parts[0] is "The address is http://"
В большинстве случаев это решение проще и чище.