PCRE 正则表达式删除点之前的空格,并在点后添加一个,但也不会影响省略号



我对正则表达式不是很热衷,我只有一些关于这个问题的中级知识,只是为了帮助我处理日常的PHP编程。但我面临的这个问题超出了我目前的知识范围。

我创建了一个正则表达式模式来查找word .Word格式的任何字符并将其替换为word. Word

正则表达式它[ t]*.[ t]*和替换它'. '

但是,我刚刚注意到上面将省略号三个点(...(变成了......

我认为这可以通过正面(或负面(向前看(或向后看(来解决,但我从来没有用过那些,尽管我做了一些实验,但我找不到正确的组合来排除省略号的三个点与我的正则表达式匹配。

任何帮助将不胜感激,特别是如果您可以在我当前的正则表达式中添加正确的缺失部分以涵盖省略号情况,而不是建议完全不同的部分。蒂亚

您可以使用以下正则表达式:

(?:[ t]+.[ t]*)|(?:[ t]*.[ t]+)|(?<=w).(?=w)

'. '作为替代

演示

输入:

word      .Word #case 1
word...        #case 2 (nothing should be done here)
word      .     Word #case3
word.   Word #case 4
word.Word #case5

输出:

word. Word
word...
word. Word
word. Word
word. Word

解释:

  • 使用您当前的正则表达式,...最终会被处理并在每次.后添加一个空格,因此我们必须添加一些约束来避免它。
  • (?:[ t]+.[ t]*)将处理#1#3的情况(强制要求在点之前至少有一个空格或制表符(
  • (?:[ t]*.[ t]+)将处理#4#3案例(强制要求在点后至少有一个空格或制表符(
  • 其余情况#5将满足(?<=w).(?=w),其中添加 lookback/lookforward 约束(在.周围的字符上(以避免匹配...

让我知道这是否清楚以及它是否适合您!干杯。

正则表达式的这个扩展将做你想要的。它寻找词边界(b(之间的单个句点,而不考虑间距([ t]*(,并用单个句点和空格替换它。最后对(b|R|$)的积极展望也允许它匹配一行中的最后一个单词。添加u修饰符使其也可以处理希腊文本等。

b[ t]*.[ t]*(?=b|R|$)

替换为

'. '

例:

$lorem = 'Λορεμ ιπσθμ .  δολορ σιτ αμετ, διcτασ
ινcιδεριντ σεα cθ.   Ρεqθε οφφενδιτ προβατθσ.    ει
δθο, ατ σιντ μοδθσ σεα    .Cθ qθανδο σθσcιπιτ 
εφφιcιαντθρ vιμ, αν.νονθμεσ οφφιcιισ περcιπιτθρ
ηισ. Ναμ εξερcι πθτεντ . ερθδιτι ιδ, αδ
qθαεqθε γραεcισ cονσεcτετθερ νεc, 
cθ ναμ σολθμ φαcερ cοτιδιεqθε   .    Στετ 
ινvενιρε περ νο, qθο αδ λεγερε δελενιτ αδιπισcινγ   .
The quick brown.fox jumps over   .  the lazy.   dog   . twice  .  ';
echo preg_replace('/b[ t]*.[ t]*(?=b|R|$)/u', '. ', $lorem);

输出:

Λορεμ ιπσθμ. δολορ σιτ αμετ, διcτασ
ινcιδεριντ σεα cθ. Ρεqθε οφφενδιτ προβατθσ. ει
δθο, ατ σιντ μοδθσ σεα. Cθ qθανδο σθσcιπιτ 
εφφιcιαντθρ vιμ, αν. νονθμεσ οφφιcιισ περcιπιτθρ
ηισ. Ναμ εξερcι πθτεντ. ερθδιτι ιδ, αδ
qθαεqθε γραεcισ cονσεcτετθερ νεc, 
cθ ναμ σολθμ φαcερ cοτιδιεqθε. Στετ 
ινvενιρε περ νο, qθο αδ λεγερε δελενιτ αδιπισcινγ.
The quick brown. fox jumps over. the lazy. dog. twice. 

最新更新