2017-08-10 171 views
1

我試圖總結每個以「##」與標籤開頭行開始行。嘗試爲文本格式實現類似GitHub/Stackoverflow的語法。PHP的preg_replace,每個包裹與

這是我得到:

$value = preg_replace('/^## (.*)$/m', '<p>$1</p>', $value); 

谷歌上搜索了好一陣子後,這似乎是正確的解決方案,但是它並沒有預期的工作還是我只是不明白的東西...

實施例文本:

## Some header 1 

Some text that doesn't need to be altered 

## Some header 2 

而這是結果:

<p>Some header 1 
</p> 

Some text that doesn't need to be altered 

<p>Some header 2</p> 

正如你所看到的,因爲它是在文本結尾第二頭得到處理罰款。但是,第一個標題會在結束標記之前的末尾添加一個額外的新行。我該如何擺脫?

+1

通過github上使用的語法是降價。我建議你使用像https://github.com/erusev/parsedown這樣的現有庫來解析你的文本 – Fabien

+1

沒有在你的代碼中發現任何問題,看看https:// 3v4l。org/I8ICB –

+1

這很有趣。試試''/(* ANYCRLF)^ ##(。*)$/m'' –

回答

1

看來,在您當前的PCRE設置中,一個點匹配LF以外的所有字符(\n,換行符),因此它與CR(\r,回車符)匹配,並且這也是換行符char。

PCRE支持默認換行(以及因此$錨的行爲)的覆蓋。爲了使.匹配所有的字符,但CR和LF,打開相應的標誌:

'/(*ANYCRLF)^## (.*)$/m' 
    ^^^^^^^^^^ 

$將斷言行結束\r\n前。

查看更多有關這和其他動詞在rexegg.com

默認情況下,PCRE編譯,你告訴它遇到時需考慮什麼是一個換行符一個.(如點沒有關係」噸匹配換行符除非dotall mode),以及所述^$錨在multiline mode行爲。您可以覆蓋此默認使用以下修飾符:

(*CR)只有一個回車被認爲是一個換行符
(*LF)只有一個換行被認爲是一個換行符(如在Unix)
(*CRLF)只有一個回車後跟行進料被認爲是換行(如在Windows)
(*ANYCRLF)任何上述三個的被認爲是一個換行符
(*ANY)任何Unicode行序列被認爲是換行符

例如,(*CR)\w+.\w+匹配Line1\nLine2因爲點是能夠匹配\n,這是不被認爲是一個換行符。見demo