2010-08-01 63 views
2

我正在修改PHP Markdown(這是一個用於Stack Overflow的標記語言的PHP解析器),試圖實現Jeff在this blog post中描述的點1,2和3。我已經輕鬆完成過去兩年,但是這一次被證明是非常困難的:我需要修改PHP markdown的正則表達式的幫助

  1. 的字內刪除支持 強調like_this_example

事實上,在「正常」降價實現like_this_example會被渲染爲像這個的例子。這是非常不可取的;我只希望_example_變成示例

我看了看源代碼,發現用來做重點的正則表達式:

var $em_relist = array(
    '' => '(?:(?<!\*)\*(?!\*)|(?<!_)_(?!_))(?=\S|$)(?![.,:;]\s)', 
    '*' => '(?<=\S|^)(?<!\*)\*(?!\*)', 
    '_' => '(?<=\S|^)(?<!_)_(?!_)', 
    ); 
var $strong_relist = array(
    '' => '(?:(?<!\*)\*\*(?!\*)|(?<!_)__(?!_))(?=\S|$)(?![.,:;]\s)', 
    '**' => '(?<=\S|^)(?<!\*)\*\*(?!\*)', 
    '__' => '(?<=\S|^)(?<!_)__(?!_)', 
    ); 
var $em_strong_relist = array(
    '' => '(?:(?<!\*)\*\*\*(?!\*)|(?<!_)___(?!_))(?=\S|$)(?![.,:;]\s)', 
    '***' => '(?<=\S|^)(?<!\*)\*\*\*(?!\*)', 
    '___' => '(?<=\S|^)(?<!_)___(?!_)', 
    ); 

我試圖在Regex Buddy打開它,但它是不夠的,而消費後它的工作一個半小時我仍然不知道從哪裏開始。有什麼建議麼?

有些人,當與 面臨的問題,認爲「我知道,我將使用 正則表達式。」現在他們有 兩個問題。

+0

這些正則表達式迷惑我,所以我也不太清楚,但我認爲你可以用'\ B'(字邊界)檢查下劃線位於單詞的開頭和結尾處。例如,'\ bfoo \ b'將匹配foo bar中的foo而不匹配foobar或barfoo。僅供參考(我確定你不能按原樣使用)'/ \ b _(。+?)_ \ b /'在我測試的輸入上做得很好。 – zneak 2010-08-01 01:06:39

+0

嘿,這不是一個答案,但你們是專家..你能幫助我這個初學者水平的WMD問題http://stackoverflow.com/questions/3616788/wmd-how-to-get-the-generated-markdown -html碼 – Moon 2010-09-01 10:01:16

回答

2

我是能夠通過抓住只有個別_enclosed_話:

$input = 'test of _this_ vs stuff_like_this...and here is _anothermatch_ and_another_fake_string'; 
$pattern = '#(?<=\s|^)(?<!_)(_[^_]*_)(?!_)#is'; 
preg_match_all($pattern, $input, $matches); 
print_r($matches); 

我不知道怎麼正是將融入上面的代碼雖然。您可能需要將它與下面的其他模式配對,以解釋兩種和三種匹配情況:

$pattern = '#(?<=\s|^)(?<!_)(__[^_]*__)(?!_)#is'; 
$pattern = '#(?<=\s|^)(?<!_)(___[^_]*___)(?!_)#is'; 
3

我也使用RegexBuddy。 :)

你可能要嘗試下面的代碼:

<?php 

$line1 = "like_this_example"; 
$line2 = "I want only _example_ to become example"; 
$pattern = '/\b_(?P<word>.*?)_\b/si'; 

if (preg_match($pattern, $line1, $matches)) 
{ 
    $result = $matches['word']; 
    var_dump($result); 
} 

if (preg_match($pattern, $line2, $matches)) 
{ 
    $result = $matches['word']; 
    var_dump($result); 
} 

?>