我真的需要帮助
preg_replace
。见下图:
<html>[sourcecode language='php']<?php echo "hello world"; ?>[/sourcecode]</html>
我只希望它显示 PHP 标签并去掉其余部分,所以我会得到以下结果:
<?php echo "hello world"; ?>
请帮忙。我尝试过以下方法:
$update = get_the_content();
$patterns = array();
$patterns[0] = '/<html>/';
$patterns[1] = '/</html>/';
$patterns[2] = '/[sourcecode language]/';
$patterns[3] = '/[/sourcecode]/';
$replacements = array();
$replacements[0] = '';
$replacements[1] = '';
$replacements[2] = '';
$replacements[3] = '';
echo preg_replace($patterns, $replacements, $update);
但这不起作用。我的问题还在于语言可能并不总是 PHP。
当使用 / 作为分隔符和 [] 时,您需要转义 / 等字符,因为它们在正则表达式中具有用途:
$update = get_the_content();
$patterns = array();
$patterns[0] = '/<html>/';
$patterns[1] = '/<\/html>/';
$patterns[2] = '/\[sourcecode language\]/';
$patterns[3] = '/\[\/sourcecode\]/';
$replacements = array();
$replacements[0] = '';
$replacements[1] = '';
$replacements[2] = '';
$replacements[3] = '';
echo preg_replace($patterns, $replacements, $update);
避开方括号。 在正则表达式中,
[
和 ]
是指示 字符类 的标签,并且该模式与括号内的任何一个字符相匹配。
为什么不采用不同的方法:
获取所有php标签和内容
$src = get_the_content();
$matches = array();
preg_match_all('/(<\?php(?:.*)\?>)/i',$src,$matches);
echo implode("\n",$matches);
或获取[源代码]块的所有内容
$src = get_the_content();
$matches = array();
preg_match_all('/\[sourcecode[^\]]*\](.*)\[\/sourcecode\]/i',$src,$matches);
echo implode("\n",$matches);
您的编码尝试需要的不仅仅是转义对正则表达式引擎具有特殊含义的字符。 方括号标签模式需要适应语言值。
strip_tags()
不适用于此任务,因为它将删除 <?php
和 ?>
包装表达式。
在第一个模式中,删除任何以字母开头的开始或结束的“看起来像标签”的子字符串(在开始的方括号和可选的斜杠之后)。
在第二个模式中,删除所有以
sourcecode
开头的左或右方括号标签。
代码:(演示)
echo preg_replace(
['#</?[a-z][^>]*>#i', '#\[/?sourcecode[^]]*]#i'],
'',
$text
);