【问题标题】:How to combine the separation of a word in the text?如何结合文本中的一个单词的分隔?
【发布时间】:2017-10-20 15:30:52
【问题描述】:

我有简单的文字:

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

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

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

也就是说,你需要这样组合这些词:

до- раддорад

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

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

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

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

并且只得到那个结果:

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

无法组合这些词:

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

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

【问题讨论】:

  • 感谢大家的回答。哪个响应代码运行得更快?我希望进行比较审查。
  • 我宁愿担心这种情况下的正则表达式精度而不是速度
  • 是的,正如@WiktorStribiżew 建议的那样,制作一些测试用例并在它们上运行所有正则表达式,寻找更精确的。
  • 只为你工作 '@Wiktor Stribiżew' 正确回答和回答 '@ishegg'

标签: php regex


【解决方案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БАФКАН آبافكن муњаррики обафкан, дастгоњи обпошї.

【讨论】:

    【解决方案2】:

    您需要替换 \R 或空格,并添加单词边界 (\b)。最后,由于您现在处理的是文字,因此您需要添加 u flag 以便引擎考虑 UTF-8。

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

    Demo

    结果

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

    【讨论】:

      【解决方案3】:

      试试下面的正则表达式:

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

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

      【讨论】:

      • 感谢您的回答,但您将这个词组合起来 Тез-тезТезтез
      • 感谢工作! :) 现在我们需要比较谁的代码更快。你的或其他的。
      【解决方案4】:

      看起来有几个不在结尾,对吧?因此,您可能还需要包括:

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

      而且我没有能力对此进行测试,但您可以将两者与

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

      【讨论】:

      • 它可以工作,但有点不正确。您不需要删除这个词中的“-”:зур - зур
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-17
      相关资源
      最近更新 更多