使用preg_replace将自定义标记替换为锚标记

时间:2018-04-30 22:01:34

标签: php

我想将<cast>Test Cast</cast>替换为<a href="www.example.com/cast/test-cast">Test Cast</a>

function replace_synopsis_tags($short_synopsis) {

        $pattern = '/<cast>(.+?)<\/cast>/i';
        $replacement = "<a href='".base_url()."casts/".str_replace(" ","-",strtolower("$1"))."'>$1</a>";
        $short_synopsis = preg_replace($pattern, $replacement, $short_synopsis);


        return $short_synopsis;
    }

    $synopsis = "<cast>Test Cast</cast>";
    echo replace_synopsis_tags($synopsis);

返回的内容是<a href="www.example.com/cast/Test Cast">Test Cast</a>

我该如何解决?

2 个答案:

答案 0 :(得分:3)

你可以使用DOMDocument,它的工作效率更高。

在线评估:https://3v4l.org/0l9hT

$html = "
<!DOCTYPE html>
<html>
<body>
<cast>cast-test</cast>
<cast>cast two !</cast>
</body>
</html>";

function castTags(string $html)
{
    $dom = new DOMDocument();
    libxml_use_internal_errors(true);
    $dom->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8'));
    libxml_clear_errors();
    $casts = $dom->getElementsByTagName('cast');
    while($cast = $casts->item(0)) {
        $value = $cast->nodeValue;
        $link = $dom->createElement('a');
        $link->setAttribute('href', "www.example.com/cast/" . rawurlencode(str_replace(' ','-',strtolower($value))));
        $link->nodeValue = $value;
        $cast->parentNode->replaceChild($link, $cast);
    }
    return $dom->saveHTML();
}

echo castTags($html); 
// <!DOCTYPE html> 
// <html>
//     <body>
//         <a href="www.example.com/cast/cast-test">cast-test</a>
//         <a href="www.example.com/cast/cast-two-%21">cast two !</a>
//     </body>
// </html>

答案 1 :(得分:1)

如果您使用的是PHP 5.5或更低版本,则只需添加\e修饰符,您的脚本就可以正常工作。但是,如果您使用的是PHP 7,则需要使用preg-replace-callback()。 PHP 7不再支持\e修饰符。

您的脚本可以更新为使用preg_replace_callback()与PHP 7兼容:

function replace_synopsis_tags($short_synopsis) {

    $pattern = '/<cast>(.+?)<\/cast>/i';
    $replacement = function($matches) { return "<a href='".base_url()."casts/".str_replace(" ","-",strtolower($matches[1]))."'>".$matches[1]."</a>"; };
    $short_synopsis = preg_replace_callback($pattern, $replacement, $short_synopsis);

    return $short_synopsis;
}

$synopsis = "<cast>Test Cast</cast>";
echo replace_synopsis_tags($synopsis);

来自preg-replace的更改日志:

  

从PHP 5.5.0开始,传入“\ e”修饰符时会发出 E_DEPRECATED 级错误。自PHP 7.0.0起,在这种情况下会发出 E_WARNING ,而“\ e”修饰符无效。

在PHP 5.4中,您可以使用此模式:

$pattern = '/<cast>(.+?)<\/cast>/ie'; // with trailing e