2012-02-03 9 views
4

にマッチした文字の数を取得しますが、誰が知っています。以下のようなもので...私は正規表現の限界に挑戦することができる正規表現グループ

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あなたがそれをしている間、 '(?:\ n | ^)'を '(?m)^'(つまり、 * start-of-stringの代わりにline * anchor)。 –

2

これは、正規表現で修飾epreg_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

関連する問題