проблема preg_split() со строками, содержащими ‘

#php #preg-split

#php #preg-split

Вопрос:

Я использую preg_split() для получения массива предложений из строки.

 $sentences = preg_split("/([.?!rn] )/", $text, 0, PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE);
  

Но когда $text содержит ‘amp;’, например:

 $text = 'this is test. we are testing this amp; we are over.';
  

затем он перестает соответствовать после ‘amp;’.

Комментарии:

1. Не могли бы вы уточнить «это мы останавливаем после amp;»? Это останавливает синтаксический анализ строки или она разбивается на амперсанд (amp;) или что?

2. Я бы обновил ваше регулярное выражение, чтобы перехватывать больше типов предложений и не удалять . . ([^.?!] (?=[.?!]['"]?s*)(?:[.?!]['"]?s*)) у меня сработало, но я, возможно, пропустил другие неясные типы окончаний / начинаний предложений. После получения совпадений (без разделения) запустите trim, чтобы избавиться от пробелов.

Ответ №1:

Ваш preg_split корректно обрабатывает предложения с амперсандами, например:

 $text = 'Sample sentence. Another sentence! Sentence with the special character amp; (ampersand). Last sentence.';
$sentences = preg_split("/([.?!rn] )/", $text, 0, PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE);
print_r($sentences);
  

Вывод:

 Array
(
    [0] => Sample sentence
    [1] => .
    [2] =>  Another sentence
    [3] => !
    [4] =>  Sentence with the special character amp; (ampersand)
    [5] => .
    [6] =>  Last sentence
    [7] => .
)
  

Комментарии:

1. Это была ошибка с ajax, который я использовал для отправки текста с помощью amp; splited it.php работает нормально. это проблема с ajax.

Ответ №2:

Ваш скрипт:

 $text = 'this is test. we are testing this amp; we are over.';
$sentences = preg_split("/([.?!rn] )/", $text, 0, PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE);
echo '<pre>'.print_r($sentences, true).'</pre>';
  

Мой вывод:

Массив
(
 [0] => это тест
 [1] => .
 [2] => мы тестируем это, и мы закончили
 [3] => .
)

Я не понимаю вашей проблемы.