正则表达式* * *第一个完整句子(句点和空格)*之后* N个字符

时间:2010-12-14 02:55:52

标签: regex movabletype

我想更清楚地摘录文字部分。因为我将使用Movable Type的regex_replace函数,所以我会在前几句话之后尝试抓住所有内容。

虽然\..*在第一个时期之后获得了所有内容,但这通常会留下太短的摘录。我怎么可能做同样的事情(第一期后的所有事情)但跳过前100个字符?

或者,我会如何在第二或第三期之后抓住所有内容?

2 个答案:

答案 0 :(得分:0)

不熟悉regex_replace,我将使用PHP preg_replace功能,您可以相应地进行调整:

$truncated = preg_replace('/^(.{100}.*?\.).*$/s', '$1', $long);

编辑:我不知道输出上的语法突出显示是什么,将整个事物视为一个字符串,它在预览中看起来很好。

还有另一个版本,它会尝试聪明地不分解带小数点的数字(或者句子可能出现在句子末尾以外的其他地方):

$truncated = preg_replace('/^(.{100}.*?\.(?![a-z0-9])).*$/s', '$1', $long);

说明:

  1. 您要保留的部分与括号分组。
  2. 您将保留至少100个字符:.{100}
  3. 然后,您可以将任何后续字符保留到第一个小数点:.*?\.
  4. 在第二个版本中,我使用了一个否定的预测 - (?![a-z0-9]) - 如果句点字符后跟数字或字母,这将导致最后一部分继续到下一个小数位。
  5. Dot匹配换行符(模式末尾的s修饰符)。如果Movable Type的regex_replace函数采用没有分隔符的模式(模式中的前导斜杠和尾随/s),则可以在模式的开头使用(?s)
  6. 在替换中使用$1以保留第一个捕获的组。

答案 1 :(得分:0)

完整的句子含糊不清,因为不同的语言有不同的编码句末的方法。我们假设一段时间后的空格是EOS: /^.*?\.\s+(?:.{N})(.*)/将N替换为所需的数字。