Как совместить разделение слова в тексте?

У меня простой текст:

 $ text = "БАДРЎ (Й) (ي (بدرو он ки рўи нозебу хунук до-
 рад, бадафт, безеб, бадбашара;  муќоб.  Тез-тез зур - зур.
 ОБАНДОМ آباندام маљ.  обпайкар, нозукан- дом, латифбадан.
 FBAФКАН آبافكن муњаррики обафкан, даст- гоњи обпошї. ";

Здесь я хочу совместить слова и получить этот результат:

БАДРЎ (Й) (ي (بدرو он ки рўи нозебу хунук дорад , бадафт, безеб, бадбашара; музоб. Тез-тез ганда. ОБАНДОМ آباندام маљ. Обпайкар, нозукандом , латифбадан. FBAФКАН آبافكن муњаррики зур – зур обафкан, дастгоњи обпошї.

То есть вам нужно совместить эти слова таким образом:

до- рад до дорад

нозукан- дом к нозукандом

даст- гоњи, чтобы датьгоњи

Я использую этот код для удаления \ r \ n:

$regex = '~-\R~'; $result = preg_replace($regex, '', $string); 

И получите только тот результат:

БАДРЎ (Й) (ي (بدرو он ки рўи нозебу хунук дорад , бадафт, безеб, бадбашара, муќоб. Тез-тез зур – зур. ОБАНДОМ آباندام ма., Обпайкар, нозукан- дом, латифбадан. FBAФКАН آبافكن муњаррики обафкан, даст- гоњи обпошї.

Не удалось объединить эти слова:

нозукан- дом к нозукандом

даст- гоњи, чтобы датьгоњи

Related of "Как совместить разделение слова в тексте?"

Я предлагаю использовать

 $result = preg_replace('~\b-(?:\R|\h)\b~u', '', $string); 

См. Демо-версию regex

Детали

  • \b – граница слова (текущей позиции должно предшествовать слово char
  • - – дефис
  • (?:\R|\h) – последовательность разрыва строки ( \R ) или ( | ) любого горизонтального пробела ( \h )
  • \b – граница слова (должно быть слово char сразу справа от текущего местоположения)

Демо-версия PHP :

 $string = "БАДРЎ(Й) (ي(بدرو он ки рўи нозебу хунук до- рад, бадафт, безеб, бадбашара; муќоб. Тез-тез зур - зур. ОБАНДОМ آباندام маљ. обпайкар, нозукан- дом, латифбадан. FБАФКАН آبافكن муњаррики обафкан, даст- гоњи обпошї."; $result = preg_replace('~\b-(?:\R|\h)\b~u', '', $string); echo $result; 

Вывод:

 БАДРЎ(Й) (ي(بدرو он ки рўи нозебу хунук дорад, бадафт, безеб, бадбашара; муќоб. Тез-тез зур - зур. ОБАНДОМ آباندام маљ. обпайкар, нозукандом, латифбадан. FБАФКАН آبافكن муњаррики обафкан, дастгоњи обпошї. 

Вам нужно заменить либо \R либо пробел, и добавить границы слов ( \b ). Наконец, поскольку вы теперь имеете дело со словами, вам нужно добавить флаг u поэтому движок рассматривает UTF-8.

 <?php $text = "БАДРЎ(Й) (ي(بدرو он ки рўи нозебу хунук до- рад, бадафт, безеб, бадбашара; муќоб. Тез-тез зур - зур. ОБАНДОМ آباندام маљ. обпайкар, нозукан- дом, латифбадан. FБАФКАН آبافكن муњаррики обафкан, даст- гоњи обпошї."; $regex = '/\b-(\R| )\b/u'; $result = preg_replace($regex, '', $text); echo $result; 

демонстрация

Результат :

БАДРЎ (Й) (ي (بدرو он ки рўи нозебу хунук дорад, бадафт, безеб, бадбашара; музоб. Тез-тез зур – зур ОБЕНДОМ آباندام маљ. Обпайкар, нозукандом, латифбадан. FБАФКАН آبافكن муњаррики обафкан, дастгоњи обпошї.

Попробуйте следующее регулярное выражение:

 preg_replace("/((?<![ ])[-][ \r\n]+)/", '', $text) 

это будет точно соответствовать этим словам. Демо здесь

Похоже, что пару из них не на концах, не так ли? Поэтому вам может потребоваться также включить:

 $regex = '~- ~'; $result = preg_replace($regex, '', $string); 

И у меня нет возможности проверить это, но вы могли бы объединить два с

 $regex = '~-(\R| )~'; $result = preg_replace($regex, '', $string);