Preg替换回调验证

时间:2017-04-25 13:00:46

标签: php regex preg-replace

所以我需要重新编写一些我在库中找到的旧代码。

    $text = preg_replace("/(<\/?)(\w+)([^>]*>)/e",
                         "'\\1'.strtolower('\\2').'\\3'", $text);

    $text = preg_replace("/<br[ \/]*>\s*/","\n",$text);
    $text = preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", "\n",
                         $text);

对于第一个我尝试过这样的人:

 $text = preg_replace_callback(
   "/(<\/?)(\w+)([^>]*>)/",
   function($subs) {
       return strtolower($subs[0]);
   },
   $text);

我有点困惑b / c我不理解这一部分:"'\\1'.strtolower('\\2').'\\3'"因此我不确定应该用什么来代替它。

据我所知,第一行查找标签,如果我有像

这样的数据,则将它们设为小写
<B>FOO</B>

你能帮助我澄清一下,如果我的代码做得好吗?

1 个答案:

答案 0 :(得分:1)

$subs是一个数组,其中包含第一个项目中的整个值以及后续项目中捕获的文本。因此,第1组位于$subs[1],第2组值位于$subs[2],等等。$subs[0]包含整个匹配值,您向其应用了strtolower,但是原始代码保留了第3组值(使用([^>]*>)捕获,也可能包含大写字母)。

使用

$text = preg_replace_callback("~(</?)(\w+)([^>]*>)~", function($subs) {
    return $subs[1] . strtolower($subs[2]) . $subs[3]; 
 }, $text);

请参阅PHP demo