我想将<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>
我该如何解决?
答案 0 :(得分:3)
你可以使用DOMDocument,它的工作效率更高。
$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