获取正则表达式组中匹配的字符数

时间:2012-02-03 04:47:03

标签: php regex

我可能正在推动正则表达式的界限,但谁知道......

我在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>
...

4 个答案:

答案 0 :(得分:3)

您可以使用:

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

Ideone Link

答案 1 :(得分: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|^)断言。

答案 2 :(得分:2)

在regexp中使用修饰符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 :(得分: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>"