我可能正在推动正则表达式的界限,但谁知道......
我在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 :(得分:3)
您可以使用:
preg_replace('/(?:\n|^)(={3,6})([^=]+)(\1)/e',
"'<h'.strlen('$1').'>'.'$2'.'</h'.strlen('$1').'>'", $input);
答案 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>"