如何结合文本中单词的分离?

时间:2017-10-20 15:30:52

标签: php regex

我的文字很简单:

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

在这里,我想结合单词并得到这个结果:

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

也就是说,您需要以这种方式组合这些词:

до- раддорад

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

даст-гоњидастгоњи

我使用此代码删除\ r \ n:

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

只得到那个结果:

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

无法合并这些字词:

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

даст-гоњидастгоњи

4 个答案:

答案 0 :(得分:1)

尝试以下正则表达式:

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

这会很好地匹配这些词。 Demo Here

答案 1 :(得分:1)

您需要替换\R或空格,并添加字边界(\b)。最后,既然您正在处理单词,则需要添加u flag,以便引擎认为是UTF-8。

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

Demo

<强>结果

  

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

答案 2 :(得分:1)

我建议使用

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

请参阅regex demo

<强>详情

  • \b - 一个单词边界(当前位置必须以单词char
  • 开头)
  • - - 连字符
  • (?:\R|\h) - 换行符序列(\R)或(|)任何水平空格(\h
  • \b - 一个单词边界(当前位置右侧必须有一个单词char)

PHP demo

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

输出:

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

答案 3 :(得分:0)

看起来有几个人不在最后,对吧?所以你可能还需要包括:

;with cte_Premiums
as
(
select  sum(Premium) as Premium, 
        Division, 
        LEFT(DATENAME(MONTH,[EffectiveDate]),3) +' '+ CONVERT(varchar(4),Year(EffectiveDate)) AS MonthYear,
        MAX(DATEPART(MM, [EffectiveDate])) as DateOrder
from ##OlegTest 
group by LEFT(DATENAME(MONTH,[EffectiveDate]),3) +' '+ CONVERT(varchar(4),Year(EffectiveDate)), Division
)

,cte_Budget
AS
(
select  insurType,
        Amount, 
        LEFT(DATENAME(MONTH,[PostDate]),3) +' '+CONVERT(varchar(4),Year([PostDate])) AS MonthYear
from BudgetData
)
select  Premium, 
        Amount as BudgetAmount, 
        Division, 
        p.MonthYear
FROM    cte_Premiums p INNER JOIN cte_Budget b ON p.Division = b.insurType and p.MonthYear = b.MonthYear
ORDER BY Division,DateOrder

我没有能力对此进行测试,但你可以将两者结合起来

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