Например, я хочу разбить это предложение:
I am a sentence.
В массив с 5 частями; I
, am
, a
, sentence
и .
,
В настоящее время я использую preg_split
после попытки explode
, но я не могу найти что-то подходящее.
Это то, что я пробовал:
$sentence = explode(" ", $sentence); /* returns array(4) { [0]=> string(1) "I" [1]=> string(2) "am" [2]=> string(1) "a" [3]=> string(8) "sentence." } */
А также это:
$sentence = preg_split("/[.?!\s]/", $sentence); /* returns array(5) { [0]=> string(1) "I" [1]=> string(2) "am" [2]=> string(1) "a" [3]=> string(8) "sentence" [4]=> string(0) "" } */
Как это может быть сделано?
Вы можете разделить границы слов:
$sentence = preg_split("/(?<=\w)\b\s*/", 'I am a sentence.');
В основном регулярное выражение проверяет, пока не будет найден символ слова, а затем после него регулярное выражение должно зафиксировать границу слова и некоторое дополнительное пространство.
Выход :
array(5) { [0]=> string(1) "I" [1]=> string(2) "am" [2]=> string(1) "a" [3]=> string(8) "sentence" [4]=> string(1) "." }
Я искал одно и то же решение и приземлился здесь. Принятое решение не работает с символами без слов, такими как апострофы и знаки акцента и так далее. Ниже найдите решение, которое сработало для меня.
Вот мое тестовое предложение:
Любимая соната Клэр для фортепиано – Sonata No. 15 до мажор.
Принятый ответ дал мне следующие результаты:
Array ( [0] => Claire [1] => 's [2] => favorite [3] => sonata [4] => for [5] => piano [6] => is [7] => Mozart [8] => 's [9] => Sonata [10] => no [11] => . 15 [12] => in [13] => C [14] => Major [15] => . )
Решение, которое я придумал, следующее:
$parts = preg_split("/\s+|\b(?=[!\?\.])(?!\.\s+)/", $sentence);
Он дает следующие результаты:
Array ( [0] => Claire's [1] => favorite [2] => sonata [3] => for [4] => piano [5] => is [6] => Mozart's [7] => Sonata [8] => no. [9] => 15 [10] => in [11] => C [12] => Major [13] => . )