在PHP中使用正则表达式提供一些帮助来恢复文本块

时间:2016-12-12 14:44:09

标签: php regex

我目前正在尝试使用PHP中的正则表达从较大的文本中检索某些信息块。几周前我问过一个问题,关于使用Javascript做同样的事情。 Javascript的解决方案有点混乱,我非常需要使用PHP来帮助它。

下面是一段类似于我想从中检索文本块的文本:

===Substantiv===
Någonting kul som det innebär, 
uppenbarligen är det så
alltså en definition på någonting

==Slumpmässig==
Detta är en slumpmässig text mitt i som stör.

?¤% Jag stör ännu mer!

===Adjektiv===
En bra definition som är grym.
Men kanske bättre än så.
Fast ändå inte, 
eller kanske faktiskt.

&56Mer störande skit som poppar in slumpmässigt här.

我想使用正则表达式以某种方式检索的文本是......

===Adjektiv===
En bra definition som är grym.
Men kanske bättre än så.
Fast ändå inte, 
eller kanske faktiskt.

...其余的我想删除。

如何将我希望很好地检索的文本放入自己的字符串中?

致以最诚挚的问候,

编辑:也就是说,我想在一段文本之前和之后用空行分割我所追求的块,然后将它放入字符串中,如果它被证明是在这种情况下,正确的块包含 === Adjektiv ===

编辑:我已经知道正则表达式了。就我所理解的而言,我面临的问题与PHP有关,不支持前瞻。

修改     {{seäven| Gift}}

==Svenska==
===Adjektiv===
{{sv-adj-t-okomp|mask=}}
'''gift'''
#{{avledning|gifta|perfpart}}; ''(om person)'' som ingått [[äktenskap]]
#:''Vet du om han är '''gift'''?''
#:''Jo, Anders och Emma är '''gifta''' med varandra.''
#:{{besläktade ord|[[gifta#Verb|gifta]], [[gifte#Substantiv|gifte]]}}
#:{{sammansättningar|[[bortgift]], [[ingift]], [[ogift]], [[omgift]]}}
#:{{fraser|[[gift par]]}}

====Översättningar====
{{ö-topp|som ingick äktenskap}}
*bokmål: {{ö+|no|gift}}
*bosniska: {{ö|bs|oženjen}} (för män), {{ö|bs|udata}} (för kvinnor)
*danska: {{ö+|da|gift}}
*engelska: {{ö+|en|married}}
*franska: {{ö+|fr|marié}}
*färöiska: {{ö|fo|giftur}}
{{ö-mitt}}
*isländska: {{ö+|is|giftur}}
*italienska: {{ö+|it|sposato}}
*litauiska: {{ö|lt|susituokęs}}
*tyska: {{ö+|de|verheiratet}}
{{ö-botten}} 

1 个答案:

答案 0 :(得分:1)

(^|\n\n)\K===Adjektiv===\n(.+(\n|$))+

这个正则表达式将匹配,没有任何前瞻或后方。如果你摆脱了\ K它应该在java脚本中工作,但你会在匹配前获得空行。 php也支持lookaheads。你可以像在wiktor的评论中那样使用\ R而不是\ n。

工作原理

这个正则表达式的工作方式是使用(^|\n\n)匹配2个空行或字符串的开头然后使用\ K来说这实际上是你想要匹配开始的地方。然后匹配===Adjektiv===\n = ==Adjektiv===加上换行符。然后它继续匹配多行,其中至少有一个字符,然后是该行的换行符。它使用(.+(\n|$))+来计算。匹配任何没有换行符与+运算符匹配至少1.它然后匹配换行符或字符串结束。这样做直到它找不到包含字符的行。如果您想允许单行为空但在两个上停止匹配,则将其替换为(.+(\n{1,2}|$))+。另外,通过扭曲()中的最后一节,您可以使用第二个捕获组排除标题。

由于不使用前瞻或后视,这在效率方面也具有优势。