我需要正则表达式来替换<
,>
和&
为<
,>
和&
,但是我只想替换<body></body>
标签中的这些字符。
示例
替换之前:
<head> <><><>& </head> <body><><>&</body>
替换后
<head> <><><>& </head> <body><><>&</body>
谢谢您的选择 :)
要用正则表达式完成这个任务,需要分几步进行:
捕获正文字符串:
正则表达式:(^.*?<body>)(.*)(<\/body>)$
匹配结果:
[0] => <head> <><><>& </head> <body><><>&</body>
[1] => <head> <><><>& </head> <body>
[2] => <><>&
[3] => </body>
分别替换匹配结果中的每种字符
重构字符串
$sourcestring="<head> <><><>& </head> <body><><>&</body>";
preg_match('/(^.*?<body>)(.*)(<\/body>)$/ims',$sourcestring,$matches);
$header=$Matches[1];
$body=$matches[2];
$footer=$Matches[3];
$body = preg_replace('/</ims','<',$body);
$body = preg_replace('/>/ims','>',$body);
$body = preg_replace('/&/ims','&',$body);
$output = $header . $body . $footer;
我用了一些技巧来完成它。首先,我找到了在 body 标签之间的文本,然后将其更改为 HTML 特殊字符并保存。接着,我用 [TO_BE_REPLACED] 替换了 body 标签之间的文本,最后再用 htmlspecialchars() 转义替换文本。
<?php
$str = '<head> <><><>& </head> <body><><>&</body>';
preg_match('/<body>(.*?)<\/body>/', $str, $match);
$special = htmlspecialchars($match[1]); // you can use html entities as well
$str = preg_replace('/<body>(.*?)<\/body>/','<body>[TO_BE_REPLACED]</body>',$str);
echo htmlspecialchars(str_replace('[TO_BE_REPLACED]', $special, $str)); //this one is only to show purpose
echo '<br>----<br>';
echo str_replace('[TO_BE_REPLACED]', $special, $str);
?>
我认为你真正需要的是:
<body>
部分。请参考this question以获取更多信息;htmlspecialchars()
用于结果。编辑:如果你确切地知道HTML的样式,当然也可以在 </head>
或 <body>
上使用 explode
将输入拆分成两部分,但这高度依赖于输入的确切格式,因此我不建议这样做。