2012-02-03 51 views
4

我可能會推動正則表達式的界限,但是誰知道...獲取正則表達式組中的匹配字符數

我正在使用php。

在類似:

preg_replace('/(?:\n|^)(={3,6})([^=]+)(\1)/','<h#>$2</h#>', $input); 

有沒有辦法找出(={3,6})多少「=」匹配,這樣我就可以向引用它在'#的是誰?

從而有效地:

===Heading 3=== into <h3>Heading 3</h3> 
====Heading 4==== into <h4>Heading 4</h4> 
... 

回答

0

我會做這樣的:

<?php 
$input = '===Heading 3==='; 
$h_tag = preg_replace_callback('#(?:\n|^)(={3,6})([^=]+)(\1)#', 'paragraph_replace', $input); 
var_dump($h_tag); 

function paragraph_replace($matches) { 
    $length = strlen($matches[1]); 
    return "<h{$length}>". $matches[2] . "</h{$length}>"; 
} 
?> 

輸出:

string(18) "<h3>Heading 3</h3>" 
2

沒有,PCRE不能做到這一點。您應該改用preg_replace_callback,並做一些文字,然後計數:

preg_replace_callback('/(?:\n|^)(={3,6})([^=]+)(\1)/', 'cb_headline', $input); 

    function cb_headline($m) { 
     list(, $markup, $text) = $m; 

     $n = strlen($markup); 
     return "<h$n>$text</h$n>"; 
    } 

另外,你可能要原諒與尾隨===跡象。不要使用反向引用,但允許使用可變數字。

您可能還希望將/m標誌用於您的正則表達式,因此您可以保留^以取代更復雜的(?:\n|^)斷言。

+1

+1,當你在它的時候,用'(?m)^'替換'(?:\ n | ^)'(即打開多行模式,這樣'^'變成一個* start-of-行*錨而不是*字符串開始)。 – 2012-02-03 05:10:31

2

這是非常簡單的用改性劑e在正則表達式,在preg_replace_callback

$str = '===Heading 3==='; 
echo preg_replace('/(?:\n|^)(={3,6})([^=]+)(\1)/e', 
    'implode("", array("<h", strlen("$1"), ">$2</h", strlen("$1"), ">"));', 
$str); 

沒有必要或者這樣

echo preg_replace('/(?:\n|^)(={3,6})([^=]+)(\1)/e', 
    '"<h".strlen("$1").">$2</h".strlen("$1").">"', 
$str); 
3

您可以使用:

preg_replace('/(?:\n|^)(={3,6})([^=]+)(\1)/e', 
      "'<h'.strlen('$1').'>'.'$2'.'</h'.strlen('$1').'>'", $input); 

Ideone Link