我需要将preg_replace替换为preg_replace_callback()

时间:2017-10-18 18:53:33

标签: php regex preg-replace php-7 preg-replace-callback

由于PHP7的更新,我需要将插件中的两行替换为preg_replacepreg_replace_callback()。我觉得它可能很简单,但我不知道如何解决它。

原作是:

for ($i = 0; $i < count($links); $i++)
{   
    $link = $links[$i];
    if ($link['hasNum'] >= $link['maxNum']) continue;
    $replace = '<a' . ($linxCSS != '' ? ' class="' . $linxCSS . '"' : '') . ' href="' . $link['href'] . '">$2</a>';
    if ($linxCSS != '') $replace = '<span class="' . $linxCSS . '">' . $replace . '</span>';
    $replace = '$1' . $replace . '$3';
    $search = "~([\s\.\,\;\!\?\:\>\(\)\'\"\*\/«])(" . $link['words'] . ")([\*\/\'\"\(\)\<\s\.\,\;\!\?\:»])~siu";
    $body = preg_replace("~(<a)(.*?)(?=<\/a>)(<\/a>)~sie", '"<:ZyX>".plgSystemSeolinks::maskContent("$1$2$3")."<:ZyX/>"', $body);
    $body = preg_replace($search, $replace, $body, $link['maxNum']);
    if ($body == '') return false;
    $link['hasNum']+= substr_count($body, '<a ');
    $links[$i] = $link;   
}

1 个答案:

答案 0 :(得分:-1)

更新修正了错字

回调将像这样完成

  for ( $i = 0; $i < count($links); $i++ )
  {
        $link = $links[$i];
        if( $link['hasNum'] >= $link['maxNum'] )
              continue;
        $replace = '<a' . ( $linxCSS != '' ? ' class="' . $linxCSS . '"' : '' ) . ' href="' . $link['href'] . '">$2</a>';

        if ( $linxCSS != '' )
             $replace = '<span class="' . $linxCSS . '">' . $replace . '</span>';

        $replace = '$1' . $replace . '$3';

        $search = '~([\s.,;!?:>()\'"*/«])(' . $link['words'] . ')([*/\'"()<\s.,;!?:»])~siu';

        $body = preg_replace_callback( '~(<a)(.*?)(?=</a>)(</a>)~si' , 
             function( $m ){
                 $msk = $m[1] . $m[2] . $m[3];
                 return '<:ZyX>' . plgSystemSeolinks::maskContent( $msk ) . '<:ZyX/>';
             },
             $body );

        $body = preg_replace( $search, $replace, $body, $link['maxNum'] );

        if ( $body == '' )
              return false;

        $link['hasNum'] += substr_count($body,'<a ');

        $links[$i] = $link;
  }